import { Listener } from './Listener';
export declare type EventHandler<Args extends any[]> = (...args: Args) => void;
export declare type EventBinder<Args extends any[]> = (event: EventHandler<Args>) => Listener;
export declare class EventEmitter {
    private _eventListeners;
    constructor();
    on<Args extends any[]>(event: EventBinder<Args>, listener: EventHandler<Args>): Listener;
    addListener<Args extends any[]>(event: EventBinder<Args>, listener: EventHandler<Args>): Listener;
    removeListener(): void;
    removeListener(id: Listener): void;
    removeListener(event: Function, listener?: Function): void;
    /**
     * @typeparam T The event handler signature.
     */
    registerEvent<T extends EventHandler<any[]>>(): (handler: T) => Listener;
    /**
     * Emit event. Calls all bound listeners with args.
     */
    protected emit<Args extends any[]>(event: EventBinder<Args>, ...args: Args): void;
}
