/**
 * @fileoverview バインディングの定義
 * @author Taketoshi Aono
 */
import { ClassType } from './classtype';
import { MethodProxy } from './method-proxy';
/**
 * バインディングの定義
 */
export interface Binding {
    /**
     * 設定された値
     */
    val: any;
    /**
     * シングルトンかどうか
     */
    singleton: boolean;
    /**
     * インスタンスを前もって作成するかどうか
     */
    eagerSingleton: boolean;
    /**
     * 即値かどうか
     */
    instance: boolean;
    /**
     * providerの設定
     */
    provider: boolean;
    /**
     * templateの設定
     */
    template: boolean;
}
/**
 * バインディング名から設定を引くための辞書
 */
export interface BindingRelation {
    [index: string]: Binding;
}
/**
 * プロバイダのインターフェース
 */
export interface Provider<T> {
    /**
     * インスタンスを作成する
     */
    provide(): T;
}
/**
 * クラス型の追加設定
 */
export declare class ClassTypeOption {
    private binding;
    constructor(binding: Binding);
    /**
     * シングルトンにする
     */
    asSingleton(): void;
    /**
     * シングルトンにする
     */
    asEagerSingleton(): void;
}
/**
 * バインディングと値をひもづける
 */
export declare class BindingPlaceholder {
    private id;
    private holder;
    /**
     * @param id 名前
     * @param holder バインディングのmap
     */
    constructor(id: string, holder: BindingRelation);
    /**
     * クラスコンストラクタをIdと紐つける
     * @param ctor コンストラクタ関数
     * @returns 追加の設定クラス
     */
    to<T>(ctor: any): any;
    /**
     * インスタンスとIdを紐つける
     * @param value 即値
     */
    toInstance<T>(value: T): void;
    /**
     * プロバイダとIdを紐つける
     * @param value プロバイダのコンストラクタ
     */
    toProvider<T>(value: ClassType<Provider<T>>): void;
}
/**
 * インターセプタと値を保持するクラス
 */
export declare class InterceptPlaceholder {
    private targetSymbol;
    /**
     * インターセプタ
     */
    private interceptor;
    /**
     * @param targetSymbol インターセプトするターゲットに設定されるsymbol
     */
    constructor(targetSymbol: symbol);
    /**
     * バインドを行う
     * @param methodProxyCtor MethodProxyのコンストラクタ
     */
    to(methodProxyCtor: new () => MethodProxy): void;
}
/**
 * テンプレート定義と値を保持するクラス
 */
export declare class TemplatePlaceholder {
    private id;
    private holder;
    /**
     * @param id templateのid
     * @param holder バインディングを保持するオブジェクト
     */
    constructor(id: string, holder: BindingRelation);
    /**
     * 値を紐つける
     * @param ctor コンストラクタ
     */
    to<T>(ctor: ClassType<T>): void;
}
