interface IConfig<T> {
    object?: INewAble<T>;
    factory?: Factory<T>;
    value?: Value<T>;
    cache?: T;
    singleton: boolean;
}
interface INewAble<T> {
    new (...args: any[]): T;
}
declare type Factory<T> = () => T;
declare type Value<T> = T;
declare class Options<T> {
    private _target;
    constructor(_target: IConfig<T>);
    inSingletonScope(): void;
}
declare class Bind<T> {
    private _target;
    constructor(_target: IConfig<T>);
    to(object: INewAble<T>): Options<T>;
    toFactory(factory: Factory<T>): Options<T>;
    toValue(value: Value<T>): void;
}
export declare class Container {
    private _registry;
    private _snapshots;
    bind<T = never>(type: symbol): Bind<T>;
    rebind<T = never>(type: symbol): Bind<T>;
    remove(type: symbol): Container;
    get<T = never>(type: symbol): T;
    snapshot(): Container;
    restore(): Container;
    private _add;
}
export {};
