UNPKG

minsky-kit

Version:
91 lines (68 loc) 2.47 kB
// 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]; }