import { LifecycleState } from '../Lifecycle';
import { SingletonDefinition } from './SingletonDefinition';
import { ObjectDefinition } from './ObjectDefinition';
export declare class BaseSingletonState extends LifecycleState {
    static INSTANTIATING: BaseSingletonState;
    static INSTANTIATED: BaseSingletonState;
    static PROPERTIES_SET: BaseSingletonState;
}
export declare enum ParamType {
    Value = 0,
    Reference = 1,
    Type = 2,
    TypeArray = 3,
    Config = 4,
    Group = 5,
    DefinitionGroup = 6,
}
export declare class ParamDefinition {
    static withValue(val: any): ParamDefinition;
    static withConfigKey(key: string, defaultValue?: any): ParamDefinition;
    static withGroupName(groupName: string): ParamDefinition;
    static withDefinitionGroupName(groupName: string): ParamDefinition;
    static withRefName(refName: string): ParamDefinition;
    static withClassName(className: string): ParamDefinition;
    static withClassNameArr(className: string): ParamDefinition;
    className: string;
    refName: string;
    type: ParamType;
    val: any;
    key: string;
    group: string;
    objectDefinitions: Array<ObjectDefinition<any>>;
    defaultValue: any;
    constructor(type: ParamType);
}
export declare class CallDefinition {
    paramName: string;
    args: ParamDefinition[];
    constructor(paramName: string, paramDefinition: ParamDefinition);
}
export declare abstract class ConfigurableSingletonDefinition<T> extends SingletonDefinition<T> {
    private constructorArgDefinitions;
    private propertiesToSetDefinitions;
    private startFunctionName;
    private shutdownFunctionName;
    constructor(clazz: any, name?: any, logger?: any);
    getConstructorArgDefinitions(): ParamDefinition[];
    getPropertiesToSetDefinitions(): CallDefinition[];
    getStartFunctionName(): string;
    getShutdownFunctionName(): string;
    constructorParamByValue(value: any): this;
    constructorParamByConfig(key: string, defaultValue?: any): this;
    constructorParamByRef(name: any): this;
    constructorParamByType(clazz: any): this;
    constructorParamByTypeArray(clazz: any): this;
    setPropertyByValue(paramName: any, value: any): this;
    setPropertyByConfig(paramName: any, key: any, defaultValue?: any): this;
    setPropertyByGroup(paramName: any, groupName: any): this;
    setPropertyByDefinitionGroup(paramName: any, groupName: any): this;
    setPropertyByRef(paramName: any, name: any): this;
    setPropertyByType(paramName: any, className: any): this;
    setPropertyByTypeArray(paramName: any, className: any): this;
    startFunction(startFunctionName: any): this;
    stopFunction(shutdownFunctionName: any): this;
    protected copyInternalProperties(copyTo: any): void;
}
export declare class BaseSingletonDefinition<T> extends ConfigurableSingletonDefinition<T> {
    instancePromise: Promise<T>;
    constructor(clazz: any, name?: any, logger?: any);
    getInstance(): Promise<T>;
    protected hasPropertiesCircularDependency(trace?: Array<string>): boolean;
    checkConstructorCircularDependency(trace?: Array<string>): void;
    protected getAllConstructorObjectDefinitions(): Array<ObjectDefinition<any>>;
    protected getAllPropertiesObjectDefinitions(): Array<ObjectDefinition<any>>;
    protected getAllPropertyObjectDefinitions(): Array<ObjectDefinition<any>>;
    protected resolveParamObjectDefinition(paramDefinition: ParamDefinition): Array<ObjectDefinition<any>>;
    private instantiate();
    private setAllProperties();
    private getSetPropertyPromise(propertyToSet);
    getParamDefinitionValue(paramDefinition: ParamDefinition): Promise<any>;
    protected doStart(): Promise<void>;
    protected doStop(): Promise<void>;
    getCopyInstance(): ObjectDefinition<T>;
}
export declare class BaseSingletonDefinitionTestUtil extends BaseSingletonDefinition<any> {
    exposeGetAllConstructorObjectDefinitions(): Array<ObjectDefinition<any>>;
}
