123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- '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
- , ee = this.ee
- , 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) {
- if (ee.eventNames) {
- args = ee.eventNames();
- } else if (ee._events) {
- args = [];
-
- for (event in ee._events) {
- if (has.call(ee._events, event)) args.push(event);
- }
-
- if (Object.getOwnPropertySymbols) {
- args = args.concat(Object.getOwnPropertySymbols(ee._events));
- }
- }
- }
-
- for (var i = 0; i < args.length; i++) {
- var listeners = 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;
- } else if (event.__ultron !== this.id) {
- continue;
- }
-
- 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;
|