import { Observable } from 'rxjs';
import { CoreModule, CoreProvide } from './interfaces';
export declare class ModuleManager {
    private static decoratorName;
    private static logger;
    /**
     * Resolve into a tree of CoreModule
     *
     * @param  {any} module
     * @returns Observable
     */
    static resolve(module: any): Observable<CoreModule>;
    static instantiate(module: CoreModule, providers?: CoreProvide[]): Observable<CoreModule>;
    /**
     * Get all the tree modules
     *
     * @param  {CoreModule} module
     * @returns CoreModule
     */
    static getModules(module: CoreModule): CoreModule[];
    /**
     * Helper to convert provider
     * to a CoreProvide type
     *
     * @param  {any} provider
     * @returns CoreProvide
     */
    static toCoreProvider(provider: any): CoreProvide;
    /**
     * ===========================================================================
     *
     *  MODULE RESOLUTION
     *
     * ===========================================================================
     */
    /**
     * Process module to CoreModule type
     * from metadata and the children
     *
     * @param  {any} module
     * @param  {CoreModule} parent?
     * @returns Observable
     */
    private static resolution(module, parent?);
    /**
     * FIX for exported providers
     * that need internal config
     *
     * @todo find a better solution
     * @param  {CoreModule} module
     * @returns CoreModule
     */
    private static coreModuleParentConfigProviders(module);
    /**
     * Convert metadata to CoreModule type
     *
     * @param  {HapinessModule} metadata
     * @param  {CoreModuleWithProviders} moduleWithProviders
     * @param  {CoreModule} parent?
     * @returns Observable
     */
    private static metadataToCoreModule(metadata, moduleWithProviders, parent?);
    /**
     * Get HapinessModule metadata type
     * if does not exist, throw an error
     *
     * @param  {Type<any>} module
     * @returns Observable
     */
    private static extractMetadata(module);
    /**
     * Make sure to convert module into
     * a CoreModuleWithProviders type
     *
     * @param  {CoreModuleWithProviders|Type<any>} module
     * @returns CoreModuleWithProviders
     */
    private static toCoreModuleWithProviders(module);
    /**
     * ===========================================================================
     *
     *  MODULE INSTANTIATION
     *
     * ===========================================================================
     */
    /**
     * Create the module's DI
     * and instantiate the module
     *
     * @param  {CoreModule} module
     * @param  {CoreProvide[]} providers?
     * @param  {CoreModule} parent?
     * @returns Observable
     */
    private static instantiation(module, providers?, parent?);
    /**
     * Instantiate and return array of libs
     *
     * @param  {CoreModule} module
     * @returns Type
     */
    private static instantiateLibs(module);
    /**
     * Collect all providers to
     * inject into the DI
     *
     * @param  {HapinessModule} module
     */
    private static collectProviders(module, providers?);
    /**
     * Extract exported children providers
     *
     * @param  {CoreModule} module
     * @returns CoreProvide[]
     */
    private static extractExportedProviders(module);
}
