|
|
'use strict';
var has = Object.prototype.hasOwnProperty;
/** * An auto incrementing id which we can use to create "unique" Ultron instances * so we can track the event emitters that are added through the Ultron * interface. * * @type {Number} * @private */ var id = 0;
/** * Ultron is high-intelligence robot. It gathers intelligence so it can start improving * upon his rudimentary design. It will learn from your EventEmitting patterns * and exterminate them. * * @constructor * @param {EventEmitter} ee EventEmitter instance we need to wrap. * @api public */ function Ultron(ee) { if (!(this instanceof Ultron)) return new Ultron(ee);
this.id = id++; this.ee = ee; }
/** * Register a new EventListener for the given event. * * @param {String} event Name of the event. * @param {Functon} fn Callback function. * @param {Mixed} context The context of the function. * @returns {Ultron} * @api public */ Ultron.prototype.on = function on(event, fn, context) { fn.__ultron = this.id; this.ee.on(event, fn, context);
return this; }; /** * Add an EventListener that's only called once. * * @param {String} event Name of the event. * @param {Function} fn Callback function. * @param {Mixed} context The context of the function. * @returns {Ultron} * @api public */ Ultron.prototype.once = function once(event, fn, context) { fn.__ultron = this.id; this.ee.once(event, fn, context);
return this; };
/** * Remove the listeners we assigned for the given event. * * @returns {Ultron} * @api public */ Ultron.prototype.remove = function remove() { var args = arguments , event;
//
// When no event names are provided we assume that we need to clear all the
// events that were assigned through us.
//
if (args.length === 1 && 'string' === typeof args[0]) { args = args[0].split(/[, ]+/); } else if (!args.length) { args = [];
for (event in this.ee._events) { if (has.call(this.ee._events, event)) args.push(event); } }
for (var i = 0; i < args.length; i++) { var listeners = this.ee.listeners(args[i]);
for (var j = 0; j < listeners.length; j++) { event = listeners[j];
//
// Once listeners have a `listener` property that stores the real listener
// in the EventEmitter that ships with Node.js.
//
if (event.listener) { if (event.listener.__ultron !== this.id) continue; delete event.listener.__ultron; } else { if (event.__ultron !== this.id) continue; delete event.__ultron; }
this.ee.removeListener(args[i], event); } }
return this; };
/** * Destroy the Ultron instance, remove all listeners and release all references. * * @returns {Boolean} * @api public */ Ultron.prototype.destroy = function destroy() { if (!this.ee) return false;
this.remove(); this.ee = null;
return true; };
//
// Expose the module.
//
module.exports = Ultron;
|