minsky-kit
Version:
Kit of components for MINSKY web agency
91 lines (68 loc) • 2.47 kB
JavaScript
// imports
import Core from '../core/Core';
// static properties
// class definition
export default class BLManager extends Core {
// constructor
constructor (args = {}, objectName = 'BL MGR') {
super(args, objectName);
this._listeners = {};
this._scope = args.scope || this;
}
// methods
add (name, listener, scope = null) {
// check if array with name exists
if (!Array.isArray(this._listeners[name])) this._listeners[name] = [];
// create listener definition
const listenerDefinition = {
original: listener,
boundListener: listener.bind(scope || this._scope),
scope: scope || this._scope,
};
// add listener definition
this._listeners[name].push(listenerDefinition);
// return newly bound listener
return listenerDefinition.boundListener;
}
addOnce (...args) {
return this.get(...args) || this.add(...args);
}
get (name, listener = null, scope = null) {
// grab specific listeners
const list = this._listeners[name];
if (list) {
// check for definition that matches parameters & return bound listener
const definition = findMatchingDefinition(list, listener, scope);
if (definition) return definition.boundListener;
}
return null;
}
remove (name, listener = null, scope = null) {
// grab specific listeners
const list = this._listeners[name];
if (list) {
// check for definition that matches parameters & remove & return bound listener
const definition = findMatchingDefinition(list, listener, scope);
const index = list.indexOf(definition);
if (index > -1) list.splice(index, 1);
// if (!definition) debugger;
return definition.boundListener;
}
return null;
}
destroy () {
for (const p of Object.keys(this._listeners)) {
this._listeners[p] = null;
}
super.destroy();
}
// getters & setters
}
// utils
function findMatchingDefinition (list, listener = null, scope = null) {
if (listener) {
return list.find((def) => (def.original === listener) && (!scope || def.scope === scope));
}
// use last adde assuming that's the one that would be requested most
return list[list.length - 1];
}