Source: observer/ControlObserver.js

(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;
        }
    }
})();