Source

utils/registry.ts

import { Constructor } from "../model/types";

/**
 * @summary Basic interface for Registries
 *
 * @interface IRegistry
 *
 * @category Model
 */
export interface IRegistry<T> {
  /**
   * @summary Registers an Object
   *
   * @param {T} obj
   * @param {any[]} args
   *
   * @method
   */
  register(obj: T | any, ...args: any[]): void;

  /**
   * @summary Retrieves an Object if it can find it
   *
   * @param {any} key
   * @param {any[]} args
   * @return {T | undefined}
   *
   * @method
   */
  get(key: any, ...args: any[]): T | undefined;
}

/**
 * @summary Basic Builder Registry Interface
 *
 * @template T
 * @interface BuilderRegistry<T>
 *
 * @category Model
 */
export interface BuilderRegistry<T> extends IRegistry<Constructor<T>> {
  /**
   * @summary Retrieves an Builder Object by name if it can
   *
   * @param {string} name
   * @param {any[]} args
   *
   * @method
   */
  get(name: string, ...args: any[]): Constructor<T> | undefined;

  /**
   * @summary Registers a constructor by name
   *
   * @param {Constructor<T>} [constructor]
   * @param {name} name
   * @param {any[]} args
   *
   * @method
   */
  register(constructor: Constructor<T>, name?: string, ...args: any[]): void;

  /**
   * @summary Builds an Object by name
   *
   * @param {{}} obj
   * @param {any[]} args
   * @return T
   *
   * @method
   */
  build(obj: Record<string, any> | T, ...args: any[]): T;
}