import { Context } from '../ioc/Context';
import { Logger } from '../log/LogManager';
import { ConfigAdapter } from '../config/ConfigProvider';
export declare type PluginLifecycleMethodName = 'willStart' | 'didStart' | 'willStop' | 'didStop';
export declare type PluginLifecycleMethod = (app: BaseApp, pluginContext?: Map<String, any>) => Promise<void> | void;
export declare type PluginType = {
    [method in PluginLifecycleMethodName]: PluginLifecycleMethod;
};
export interface Plugin {
    name: string;
    willStart?: PluginLifecycleMethod;
    didStart?: PluginLifecycleMethod;
    willStop?: PluginLifecycleMethod;
    didStop?: PluginLifecycleMethod;
}
export interface PluginWithWillStart {
    willStart: PluginLifecycleMethod;
}
export interface PluginWithDidStart {
    didStart: PluginLifecycleMethod;
}
export interface PluginWithWillStop {
    willStop: PluginLifecycleMethod;
}
export interface PluginWithDidStop {
    didStop: PluginLifecycleMethod;
}
export interface PluginNameable {
    name: string;
}
export declare type PluginImplementsAtLeastOneMethod = PluginWithWillStart | PluginWithDidStart | PluginWithWillStop | PluginWithDidStop;
export declare type PluginImplemenation = PluginNameable & PluginImplementsAtLeastOneMethod;
export interface AppOptions {
    logger?: Logger;
    config?: ConfigAdapter;
    shutdownTimer?: number;
}
export declare type PluginContext = Map<String | Symbol, any>;
export default class BaseApp {
    protected logger: Logger;
    protected context: Context;
    protected appName: string;
    protected plugins: PluginImplemenation[];
    protected pluginContext: PluginContext;
    /**
     * Creates a new Inceptum App
     */
    constructor(options?: AppOptions);
    use(...plugins: PluginImplemenation[]): void;
    /**
     * Register services or controllers with Inceptum
     * Note that we are using "npm globby" internally for glob matching.
     *
     * Globs are disabled by default. Pass isGlob=true to enable glob matching
     *
     * Globs will be automatically activated if the "patterns" parameter is an array of strings,
     * or if it contains magic characters (eg: * ? { })
     *
     * @param {string|Array<string>} patterns - path as a relative path or as glob pattern(s). See options for more details
     * @param {Object} [options] - options object for enabling and configuring glob matching
     * @param {boolean} [options.isGlob=false] - pass true to treat the path as a glob
     * @param {Object} [options.globOptions] - options to pass to globby
     */
    addDirectory(patterns: string | Array<string>, options?: {
        isGlob: boolean;
        globOptions: Object;
    }): void;
    register(...plugins: PluginImplemenation[]): void;
    getRegisteredPluginNames(): string[];
    hasRegisteredPlugin(name: string): boolean;
    private runLifecycleMethodOnPlugins;
    start(): Promise<any>;
    stop(): Promise<any>;
    getContext(): Context;
    getConfig(key: any, defaultValue: any): any;
    hasConfig(key: any): boolean;
}
