Source: observer/Observer.js

(function () {
    /**
     * @namespace observer
     * @memberof Help4
     */
    Help4.observer = {};

    /**
     * the callback function that is called in case an event occurs
     * @callback Help4.observer.Callback
     * @param {Object} event - the event that is caught by the observer
     * @returns {*}
     */

    /**
     * Base class for observers.
     * @augments Help4.jscore.Base
     */
    Help4.observer.Observer = class extends Help4.jscore.Base {
        /**
         * @override
         * @param {Help4.observer.Callback} callback
         * @param {Object} [derived]
         */
        constructor(callback, derived) {
            super({
                statics: {
                    _callback:    {init: callback, destroy: false},
                    _connections: {init: [], destroy: false}
                },
                derived
            });
        }

        /** destroys the observer */
        destroy() {
            this.disconnect();
            super.destroy();
        }

        /**
         * returns the number of active connections
         * @returns {number}
         */
        count() {
            return this._connections.length;
        }

        /**
         * starts target observation
         * @param {*} target - the to be observed target
         * @param {Object} [options] - configuration, options, data
         * @returns {Help4.observer.Observer}
         */
        observe(target, options) {
            const {_connections} = this;
            for (const {target: t} of _connections) {
                if (t === target) {
                    this.disconnect();
                    break;
                }
            }
            _connections.push({target, options});
            return this;
        }

        /**
         * stops all observations
         * @returns {Help4.observer.Observer}
         */
        disconnect() {
            this._connections = [];
            return this;
        }
    }
})();