import { ScriptingLanguage } from '@/domain/ScriptingLanguage'; import { assertInRange } from '@/application/Common/Enum'; import { IScriptingLanguageFactory } from './IScriptingLanguageFactory'; type Getter = () => T; export abstract class ScriptingLanguageFactory implements IScriptingLanguageFactory { private readonly getters = new Map>(); public create(language: ScriptingLanguage): T { assertInRange(language, ScriptingLanguage); const getter = this.getters.get(language); if (!getter) { throw new RangeError(`unknown language: "${ScriptingLanguage[language]}"`); } const instance = getter(); return instance; } protected registerGetter(language: ScriptingLanguage, getter: Getter) { assertInRange(language, ScriptingLanguage); if (this.getters.has(language)) { throw new Error(`${ScriptingLanguage[language]} is already registered`); } this.getters.set(language, getter); } }