export interface IEventable { registerEvent(handler: Event): void; releaseEvents():Event[]; } export class Event { constructor(public payload: TEvent) {} } export function Eventable() { // eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any return function {}>(Base: TBase) { return class extends Base implements IEventable { _events: Event[] = []; registerEvent(handler: Event):void { this._events.push(handler); } releaseEvents(): Event[] { const list = this._events; this._events = []; return list; } }; }; }