72 lines
1.9 KiB
JavaScript
72 lines
1.9 KiB
JavaScript
// Based on https://github.com/diy/intercom.js/blob/master/lib/events.js
|
|
// Copyright 2012 DIY Co Apache License, Version 2.0
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
function removeItem(item, array) {
|
|
for (var i = array.length - 1; i >= 0; i--) {
|
|
if (array[i] === item) {
|
|
array.splice(i, 1);
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
|
|
var EventEmitter = function() {};
|
|
|
|
EventEmitter.createInterface = function(space) {
|
|
var methods = {};
|
|
|
|
methods.on = function(name, fn) {
|
|
if (typeof this[space] === 'undefined') {
|
|
this[space] = {};
|
|
}
|
|
if (!this[space].hasOwnProperty(name)) {
|
|
this[space][name] = [];
|
|
}
|
|
this[space][name].push(fn);
|
|
};
|
|
|
|
methods.off = function(name, fn) {
|
|
if (typeof this[space] === 'undefined') return;
|
|
if (this[space].hasOwnProperty(name)) {
|
|
removeItem(fn, this[space][name]);
|
|
}
|
|
};
|
|
|
|
methods.trigger = function(name) {
|
|
if (typeof this[space] !== 'undefined' && this[space].hasOwnProperty(name)) {
|
|
var args = Array.prototype.slice.call(arguments, 1);
|
|
for (var i = 0; i < this[space][name].length; i++) {
|
|
this[space][name][i].apply(this[space][name][i], args);
|
|
}
|
|
}
|
|
};
|
|
|
|
methods.removeAllListeners = function(name) {
|
|
if (typeof this[space] === 'undefined') return;
|
|
var self = this;
|
|
self[space][name].forEach(function(fn) {
|
|
self.off(name, fn);
|
|
});
|
|
};
|
|
|
|
return methods;
|
|
};
|
|
|
|
var pvt = EventEmitter.createInterface('_handlers');
|
|
EventEmitter.prototype._on = pvt.on;
|
|
EventEmitter.prototype._off = pvt.off;
|
|
EventEmitter.prototype._trigger = pvt.trigger;
|
|
|
|
var pub = EventEmitter.createInterface('handlers');
|
|
EventEmitter.prototype.on = function() {
|
|
pub.on.apply(this, arguments);
|
|
Array.prototype.unshift.call(arguments, 'on');
|
|
this._trigger.apply(this, arguments);
|
|
};
|
|
EventEmitter.prototype.off = pub.off;
|
|
EventEmitter.prototype.trigger = pub.trigger;
|
|
EventEmitter.prototype.removeAllListeners = pub.removeAllListeners;
|
|
|
|
module.exports = EventEmitter;
|