import 'reflect-metadata';
export declare const __ContextSymbol: unique symbol;
declare type Symbol = any;
declare type Type = any;
declare type Instance = any;
declare type Constructor<T> = {
    new (...args: any[]): T;
};
export declare type ContextOptions = {
    provide?: ([Type, Instance] | Instance)[];
};
export declare type PartialContext = {
    get<Instance>(type: Type): Instance | null;
    set(type: Type, instance: Instance): void;
    has(type: Type): boolean;
};
export declare type Context = PartialContext & {
    bind: (instance: Instance) => void;
    instantiate: <T>(type: Constructor<T>) => T;
};
export declare const __TypeRegistry: Map<any, any>;
export declare const __InstanceRegistry: Map<any, any>;
export declare function createPartialForContext(context: Context, options?: ContextOptions): PartialContext;
export declare function createContext(options?: ContextOptions): Context;
export declare const Context: (options?: ContextOptions) => ClassDecorator;
export declare const Inject: (type?: any) => PropertyDecorator;
export declare const Provide: (symbol?: any) => ClassDecorator;
export declare function provide(symbol: Symbol, type: Type): void;
export declare function provide(type: Type): void;
export declare const ProvideInstance: (symbol?: any) => ClassDecorator;
export declare function provideInstance<T>(symbol: Symbol, constructor: Constructor<T>): T;
export declare function provideInstance<T>(instance: Constructor<T>): T;
export declare function provideRawInstance<T extends Instance>(symbol: Symbol, instance: T): T;
export declare function provideRawInstance<T extends Instance>(instance: T): T;
export declare const getContext: (instance: Instance) => Context | null;
export declare const isContext: (instance: any) => instance is Context;
export {};
