event_event_handler_layer.js

/**
 * @module EventHandlerLayer
 * @fileoverview Contains EventHandlerLayer class.
 */

/**
 * Generalized events manager for use in App, Actor, etc.
 * @class
 */
class EventHandlerLayer {
    /**
     * Create a new EventHandler.
     * @constructor
     */
    constructor(parent, prefix = "") {
        this._parent = parent;
        this._parent.addChild(this);
        this._prefix = prefix;

        this._children = new Set();
    }

    getRoot() {
        if (this._parent instanceof EventHandlerLayer)
            return this._parent.getRoot();

        return this._parent;
    }

    addChild(child) {
        this._children.add(child);
    }


    // Adding

    /**
     * Register a new event listener.
     * @param {string} event Key for the event to listen for
     * @param {function} func Function to run upon firing
     */
    on(event, func = () => {}) {
        this._parent.on(this._prefix + event, func);
    }


    // Execution

    /**
     * Trigger an event.
     * @param {string} event Key of event to trigger.
     * @param args Arguments to pass into listener function
     */
    do(event, ...args) {
        this._parent.do(this._prefix + event, ...args);
    }


    // Removal

    /**
     * Clear all registered events.
     */
    clear() {
        this._parent.clearPrefix(this._prefix);
    }

    /**
     * Remove a registered event.
     * @param {string} event Event ID/type
     * @param {number} i Index of script (ignore to delete all for event type)
     */
    remove(event, i = -1) {
        this._parent.remove(this._prefix + event, i);
    }


    // Iteration

    /**
     * Run a function for each listing.
     * @param {function} func Function to run
     */
    forEach(func = (array, id) => {}) {
        this._parent.forEach(func);
    }
}

export default EventHandlerLayer;