/** @module build */

/**
 * Interface for component factories.
 * 
 * Factories use locators to identify components to be created.
 * 
 * The locators are similar to those used to locate components in references.
 * They can be of any type like strings or integers. However Pip.Services toolkit
 * most often uses Descriptor objects as component locators.
 */
export interface IFactory {
    /**
     * Checks if this factory is able to create component by given locator.
     * 
     * This method searches for all registered components and returns
     * a locator for component it is able to create that matches the given locator.
     * If the factory is not able to create a requested component is returns null.
     * 
     * @param locator     a locator to identify component to be created.
     * @returns            a locator for a component that the factory is able to create.
     */
    canCreate(locator: any): any;

    /**
     * Creates a component identified by given locator.
     * 
     * @param locator     a locator to identify component to be created.
     * @returns the created component.
     * 
     * @throws a CreateException if the factory is not able to create the component.
     */
    create(locator: any): any;
}
