/** */ import { Controller } from './controller'; import { BaseEngine } from './base_engine'; import { View } from './view'; import { Guid } from './guid'; import { RouteService } from './route_service'; export class Witcase implements BaseEngine { public engine: T; public defaultAction: () => void; public static current: any; private views: View[] = []; private controllers: Controller[] = []; public route: RouteService = new RouteService(); private constructor(){ } public static create(){ Witcase.current = new Witcase(); return Witcase.current; } public start(engineStarter: (baseEngine: BaseEngine) => T): void { this.engine = engineStarter(this); } public create = (): void => { this.defaultAction(); } private static resourceLoaders: ((engine: any) => void)[] = []; public static preload(resourceLoader: (engine: T)=>void):void { Witcase.resourceLoaders.push(resourceLoader); } public preload = (): void => { for (const resourceLoader of Witcase.resourceLoaders){ resourceLoader(this.engine); } } public update = (): void => { for (const controller of this.controllers){ controller.checkModelChanges(); } for (const view of this.views){ view.checkModelChanges(); view.updateView(); } } public render = (): void => { for (const view of this.views){ view.renderView(); } } public registerView(view: View){ this.views.push(view); } public unregisterView(viewToRemove: View){ this.views = this.views.filter((view) => { return viewToRemove !== view }); } public registerController(controller: Controller){ this.controllers.push(controller); } }