* The same functionality as EventEmitter but with the inclusion of callbacks
*/
-/*
- * Promise style object to emit events to listeners
- */
-function EmitCall (event_name, event_data) {
+
+
+function PluginInterface () {
+ // Holder for all the bound listeners by this module
+ this._listeners = {};
+}
+
+
+
+PluginInterface.prototype.on = function (event_name, fn, scope) {
+ this._listeners[event_name] = this._listeners[event_name] || [];
+ this._listeners[event_name].push(['on', fn, scope]);
+};
+
+
+
+PluginInterface.prototype.once = function (event_name, fn, scope) {
+ this._listeners[event_name] = this._listeners[event_name] || [];
+ this._listeners[event_name].push(['once', fn, scope]);
+};
+
+
+
+PluginInterface.prototype.off = function (event_name, fn, scope) {
+ var idx;
+
+ if (typeof event_name === 'undefined') {
+ // Remove all listeners
+ this._listeners = {};
+
+ } else if (typeof fn === 'undefined') {
+ // Remove all of 1 event type
+ delete this._listeners[event_name];
+
+ } else if (typeof scope === 'undefined') {
+ // Remove a single event type + callback
+ for (idx in (this._listeners[event_name] || [])) {
+ if (this._listeners[event_name][idx][1] === fn) {
+ delete this._listeners[event_name][idx];
+ }
+ }
+ } else {
+ // Remove a single event type + callback + scope
+ for (idx in (this._listeners[event_name] || [])) {
+ if (this._listeners[event_name][idx][1] === fn && this._listeners[event_name][idx][2] === scope) {
+ delete this._listeners[event_name][idx];
+ }
+ }
+ }
+};
+
+
+
+// Call all the listeners for a certain event, passing them some event data that may be changed
+PluginInterface.prototype.emit = function (event_name, event_data) {
+ var emitter = new this.EmitCall(event_name, event_data);
+ var listeners = this._listeners[event_name] || [];
+
+ // Once emitted, remove any 'once' bound listeners
+ emitter.done(function () {
+ var len = listeners.length,
+ idx;
+
+ for(idx = 0; idx < len; idx++) {
+ if (listeners[idx][0] === 'once') {
+ listeners[idx] = undefined;
+ }
+ }
+ });
+
+ // Emit the event to the listeners and return
+ emitter.callListeners(listeners);
+ return emitter;
+};
+
+
+
+// Promise style object to emit events to listeners
+PluginInterface.prototype.EmitCall = function EmitCall (event_name, event_data) {
var that = this,
completed = false,
completed_fn = [],
// Emit this event to an array of listeners
function callListeners(listeners) {
var current_event_idx = -1;
-
+
// Make sure we have some data to pass to the listeners
event_data = event_data || undefined;
-
+
// If no bound listeners for this event, leave now
if (listeners.length === 0) {
emitComplete();
completed = true;
var funcs = prevented ? prevented_fn : completed_fn;
+ funcs = funcs || [];
// Call the completed/prevented functions
- (funcs || []).forEach(function (fn) {
- if (typeof fn === 'function') fn();
- });
+ for (var idx = 0; idx < funcs.length; idx++) {
+ if (typeof funcs[idx] === 'function') funcs[idx]();
+ }
}
done: addCompletedFunc,
prevented: addPreventedFunc
};
-}
-
-
-
-
-
-
-function PluginInterface () {
- // Holder for all the bound listeners by this module
- this._listeners = {};
-}
-
-
-PluginInterface.prototype.on = function (event_name, fn, scope) {
- this._listeners[event_name] = this._listeners[event_name] || [];
- this._listeners[event_name].push(['on', fn, scope]);
};
-PluginInterface.prototype.once = function (event_name, fn, scope) {
- this._listeners[event_name] = this._listeners[event_name] || [];
- this._listeners[event_name].push(['once', fn, scope]);
-};
-
-
-
-PluginInterface.prototype.off = function (event_name, fn, scope) {
- var idx;
-
- if (typeof event_name === 'undefined') {
- // Remove all listeners
- this._listeners = {};
-
- } else if (typeof fn === 'undefined') {
- // Remove all of 1 event type
- delete this._listeners[event_name];
-
- } else if (typeof scope === 'undefined') {
- // Remove a single event type + callback
- for (idx in (this._listeners[event_name] || [])) {
- if (this._listeners[event_name][idx][1] === fn) {
- delete this._listeners[event_name][idx];
- }
- }
- } else {
- // Remove a single event type + callback + scope
- for (idx in (this._listeners[event_name] || [])) {
- if (this._listeners[event_name][idx][1] === fn && this._listeners[event_name][idx][2] === scope) {
- delete this._listeners[event_name][idx];
- }
- }
- }
-};
-
-
-
-// Call all the listeners for a certain event, passing them some event data that may be changed
-PluginInterface.prototype.emit = function (event_name, event_data) {
- var emitter = new EmitCall(event_name, event_data);
- var listeners = this._listeners[event_name] || [];
-
- // Once emitted, remove any 'once' bound listeners
- emitter.done(function () {
- listeners.forEach(function (listener, idx) {
- if (listener[0] === 'once') {
- listeners[idx] = undefined;
- }
- });
- });
-
- // Emit the event to the listeners and return
- emitter.callListeners(listeners);
- return emitter;
-};
-
-
-module.exports = PluginInterface;
+// If running a node module, set the exports
+if (typeof module === 'object' && typeof module.exports !== 'undefined') {
+ module.exports = PluginInterface;
+}