import {ModulesDefiner} from "./ModulesDefiner"; import {CurliApplication} from "../CurliApplication"; import {ModulesHandler} from "../Module/ModulesHandler"; import {Module} from "../Module/Module"; import {BASE_EVENTS_NAMES} from "../Events/BaseEventsNamesConst"; export class ModulesDefinersHandler { private modulesDefinersCollection: Array; public constructor(private app: CurliApplication, private modules: ModulesHandler) { this.modulesDefinersCollection = []; } /** * * @param modulesDefiner The definer we want to add */ public add(modulesDefiner: ModulesDefiner){ this.checkIfAlreadyExist(modulesDefiner); this.modulesDefinersCollection.push(modulesDefiner); this.app.emit(BASE_EVENTS_NAMES.MODULES_DEFINER_REGISTER + modulesDefiner.getName()); this.registerEventFroModulesDefiner(modulesDefiner); } private checkIfAlreadyExist(modulesDefiner: ModulesDefiner) { this.modulesDefinersCollection.forEach((modulesDefinerItem: ModulesDefiner)=>{ if (modulesDefinerItem.getName() === modulesDefiner.getName()){ throw new Error('Modules defined ('+modulesDefiner.getName()+') already registered.'); } }) } private registerEventFroModulesDefiner(definer: ModulesDefiner){ this.app.on(definer.whenCallMethodInModules(), ()=>{ definer.ini(); const modulesList: Array = this.modules.getModulesWithMethod(definer.getMethodName()); modulesList.forEach((module: Module)=>{ definer.callMethodInModules(module); }); definer.afterCalledModules(); }); } }