/**
* Mixins functionality to make an object have "plugins".
*
* @mixin
* @param {object} obj The object to mix into.
* @example
* function MyObject() {}
*
* pluginTarget.mixin(MyObject);
*/
function pluginTarget(obj) {
obj.__plugins = {};
/**
* Adds a plugin to an object
*
* @param {string} pluginName The events that should be listed.
* @param {Function} ctor The constructor function for the plugin.
*/
obj.registerPlugin = function(pluginName, ctor) {
obj.__plugins[pluginName] = ctor;
};
/**
* Instantiates all the plugins of this object
*/
obj.prototype.initPlugins = function() {
this.plugins = this.plugins || {};
for (var o in obj.__plugins) {
this.plugins[o] = new (obj.__plugins[o])(this);
}
};
/**
* Removes all the plugins of this object
*/
obj.prototype.destroyPlugins = function() {
for (var o in this.plugins) {
this.plugins[o].destroy();
this.plugins[o] = null;
}
this.plugins = null;
};
}
module.exports = {
/**
* Mixes in the properties of the pluginTarget into another object
*
* @param {object} obj The obj to mix into
*/
mixin: function mixin(obj) {
pluginTarget(obj);
},
};