(function() {
/**
* observes events fired from Help4.control or Help4.control2 controls
* @augments Help4.observer.Observer
*/
Help4.observer.ControlObserver = class extends Help4.observer.Observer {
/**
* @override
* @param {Help4.observer.Callback} callback
*/
constructor(callback) {
// params: eventType, control, ..., value
const listener = (eventType, ...args) => {
const target = Array.prototype.slice.call(args, 0, args.length - 1);
this._callback({
type: eventType,
target: target.length === 1 ? target[0] : target,
value: args[args.length - 1]
});
};
super(callback, {
statics: {
_listener: {init: listener, destroy: false}
}
});
}
/**
* observes events fired from a Help4.control or Help4.control2 control; incompatible override!
* @param {Help4.control.Control|Help4.control2.Control} control - the to be observed control
* @returns {Help4.observer.ControlObserver}
*/
observe(control) {
if (control instanceof Help4.control.Control) {
super.observe(control);
control.addListener('*', this._listener);
} else if (control instanceof Help4.control2.Control) {
super.observe(control);
control.addListener('*', this._callback);
} else {
throw new TypeError('ControlObserver requires a Help4.control.Control or a Help4.control2.Control!');
}
return this;
}
/**
* @override
* @returns {Help4.observer.ControlObserver}
*/
disconnect() {
const {_connections, _listener, _callback} = this;
for (const {target} of _connections) {
target instanceof Help4.control.Control
? target.removeListener('*', _listener)
: target.removeListener('*', _callback);
}
super.disconnect();
return this;
}
}
})();