import { ProxyDiContainer } from './ProxyDiContainer';
export type DependencyId = string | symbol;
export type DependencyClass<T> = new (...args: any[]) => T;
export type Setter = (object: unknown, value: unknown) => void;
export type Injection = {
    property: string | symbol;
    dependencyId: DependencyId;
    set: Setter;
};
export type IProxyDiContainer = {
    id: number;
    settings: Required<ContainerSettings>;
    isKnown: (dependencyId: DependencyId) => boolean;
    injectDependenciesTo: (dependency: any) => void;
    register: (dependency: any, dependencyId: DependencyId) => any;
    resolve: <T>(dependencyId: DependencyId | DependencyClass<any>) => T & ContainerizedDependency;
    createChildContainer: () => IProxyDiContainer;
    children: IProxyDiContainer[];
    getChild(id: number): IProxyDiContainer;
    remove: (dependencyId: DependencyId | ContainerizedDependency) => void;
    bakeInjections(): void;
    destroy: () => void;
};
export declare const INJECTIONS: unique symbol;
/**
 * This symbol constant defines a property name.
 * This property is present in each dependency instance that was registered in ProxyDiContainer.
 * The property stores the dependency identifier that should be used to resolve dependency from the container where it was registered.
 */
export declare const DEPENDENCY_ID: unique symbol;
/**
 * This symbol constant defines a property name.
 * This property is present in each dependency instance that was registered in ProxyDiContainer.
 * The property stores a reference to the ProxyDiContainer in which the dependency was registered.
 */
export declare const PROXYDI_CONTAINER: unique symbol;
export declare const ON_CONTAINERIZED: unique symbol;
export type OnContainerizedMethod = (container: ProxyDiContainer) => void;
export type Injections = Record<string | symbol, Injection>;
export type Dependency = {
    [INJECTIONS]: Injections;
};
/**
 * Respresent dependency instance that was registered in ProxyDi container
 */
export type ContainerizedDependency = Dependency & {
    /**
     * Unique identifier that could use to resolve this instance from container where it was registered
     */
    [DEPENDENCY_ID]: DependencyId;
    /**
     * ProxyDi container in which this instance was registered
     */
    [PROXYDI_CONTAINER]: IProxyDiContainer;
};
export type ContainerSettings = {
    allowRegisterAnything?: boolean;
    allowRewriteDependencies?: boolean;
    resolveInContainerContext?: boolean;
};
export declare const IS_INJECTION_PROXY: unique symbol;
export declare const INJECTION_OWNER: unique symbol;
export declare const IS_INSTANCE_PROXY: unique symbol;
export type InjectionProxy = {
    [IS_INJECTION_PROXY]: true;
    [INJECTION_OWNER]: ContainerizedDependency;
    [PROXYDI_CONTAINER]: IProxyDiContainer;
};
