1 var events
= require('events'),
2 util
= require('util'),
3 path
= require('path'),
5 EventPublisher
= require('./plugininterface.js');
10 * The main point in which events are fired and bound to
13 // Where events are bound to
17 // Create a publisher to allow event subscribing
18 function Publisher (obj
) {
19 var EventPublisher
= require('./plugininterface.js');
20 return new EventPublisher();
24 // Register an already created Publisher() as the active instance
25 function registerPublisher (obj
) {
26 active_publisher
= obj
;
35 * Keeping track of modules
38 // Hold the loaded modules
39 var registered_modules
= [];
41 function loadModule (module_file
) {
43 full_module_filename
= path
.join(global
.config
.module_dir
, module_file
);
45 // Make sure that the module is contained in the proper module directory
46 if (full_module_filename
.lastIndexOf(global
.config
.module_dir
, 0) !== 0) {
50 // Get an instance of the module and remove it from the cache
52 module
= require(full_module_filename
);
53 delete require
.cache
[require
.resolve(full_module_filename
)];
55 // Module was not found
63 // Find a registered collection, .dispose() of it and remove it
64 function unloadModule (module
) {
65 var found_module
= false;
67 registered_modules
= _
.reject(registered_modules
, function (registered_module
) {
68 if (module
.toLowerCase() === registered_module
.module_name
.toLowerCase()) {
71 registered_module
.dispose();
86 * To be created by modules to bind to server events
88 function Module (module_name
) {
89 registered_modules
.push(this);
90 this.module_name
= module_name
;
92 // Holder for all the bound events by this module
98 // Keep track of this modules events and bind
99 Module
.prototype.on = function (event_name
, fn
) {
100 var internal_events
= ['dispose'];
102 this._events
[event_name
] = this._events
[event_name
] || [];
103 this._events
[event_name
].push(fn
);
105 // If this is an internal event, do not propogate the event
106 if (internal_events
.indexOf(event_name
) === -1) {
107 active_publisher
.on(event_name
, fn
);
112 // Keep track of this modules events and bind once
113 Module
.prototype.once = function (event_name
, fn
) {
114 this._events
[event_name
] = this._events
[event_name
] || [];
115 this._events
[event_name
].push(fn
);
117 active_publisher
.once(event_name
, fn
);
121 // Remove any events by this module only
122 Module
.prototype.off = function (event_name
, fn
) {
125 if (typeof event_name
=== 'undefined') {
129 } else if (typeof fn
=== 'undefined') {
130 // Remove all of 1 event type
131 delete this._events
[event_name
];
134 // Remove a single event + callback
135 for (idx
in (this._events
[event_name
] || [])) {
136 if (this._events
[event_name
][idx
] === fn
) {
137 delete this._events
[event_name
][idx
];
142 active_publisher
.off(event_name
, fn
);
147 // Clean up anything used by this module
148 Module
.prototype.dispose = function () {
149 // Call any dispose callbacks
150 (this._events
['dispose'] || []).forEach(function (callback
) {
154 // Remove all bound event listeners
166 Publisher
: Publisher
,
169 registerPublisher
: registerPublisher
,
171 unload
: unloadModule
,
172 getRegisteredModules: function () { return registered_modules
; }