1 var events
= require('events'),
2 util
= require('util'),
4 EventPublisher
= require('./plugininterface.js');
9 * The main point in which events are fired and bound to
12 // Where events are bound to
16 // Create a publisher to allow event subscribing
17 function Publisher (obj
) {
18 var EventPublisher
= require('./plugininterface.js');
19 return new EventPublisher();
23 // Register an already created Publisher() as the active instance
24 function registerPublisher (obj
) {
25 active_publisher
= obj
;
34 * Keeping track of modules
37 // Hold the loaded modules
38 var registered_modules
= {};
40 function loadModule (module_file
) {
43 // Get an instance of the module and remove it from the cache
45 module
= require(module_file
);
46 delete require
.cache
[require
.resolve(module_file
)];
48 // Module was not found
57 // Find a registered collection, .dispose() of it and remove it
58 function unloadModule (module
) {
59 registered_modules
= _
.reject(registered_modules
, function (registered_module
) {
60 if (module
=== registered_module
) {
74 * To be created by modules to bind to server events
76 function Module (module_name
) {
77 registered_modules
[module_name
] = this;
81 // Holder for all the bound events by this module
82 Module
.prototype._events
= {};
85 // Keep track of this modules events and bind
86 Module
.prototype.on = function (event_name
, fn
) {
87 var internal_events
= ['dispose'];
89 this._events
[event_name
] = this._events
[event_name
] || [];
90 this._events
[event_name
].push(fn
);
92 // If this is an internal event, do not propogate the event
93 if (internal_events
.indexOf(event_name
) === -1) {
94 active_publisher
.on(event_name
, fn
);
99 // Keep track of this modules events and bind once
100 Module
.prototype.once = function (event_name
, fn
) {
101 this._events
[event_name
] = this._events
[event_name
] || [];
102 this._events
[event_name
].push(fn
);
104 active_publisher
.once(event_name
, fn
);
108 // Remove any events by this module only
109 Module
.prototype.off = function (event_name
, fn
) {
112 if (typeof event_name
=== 'undefined') {
116 } else if (typeof fn
=== 'undefined') {
117 // Remove all of 1 event type
118 delete this._events
[event_name
];
121 // Remove a single event + callback
122 for (idx
in (this._events
[event_name
] || [])) {
123 if (this._events
[event_name
][idx
] === fn
) {
124 delete this._events
[event_name
][idx
];
129 active_publisher
.removeListener(event_name
, fn
);
134 // Clean up anything used by this module
135 Module
.prototype.dispose = function () {
136 // Call any dispose callbacks
137 (this._events
['dispose'] || []).forEach(function (callback
) {
141 // Remove all bound event listeners
153 Publisher
: Publisher
,
156 registerPublisher
: registerPublisher
,
158 unload
: unloadModule
,
159 getRegisteredModules: function () { return registered_modules
; }