import { IKosDataModel, KosCreationContext } from './kosModel';
import { IdentifiableModelFactory, KosIdentifiableModelRegistration } from '../types';

type Reg<T extends IKosDataModel, O extends object = Record<string, any>> = KosIdentifiableModelRegistration<T, O> & {
    singleton: false;
    factory: IdentifiableModelFactory<T, O>;
};
interface ModelRegistration<T extends IKosDataModel, O extends object = Record<string, any>> {
    [k: string]: Reg<T, O>;
}
interface RegistrationProps<T extends IKosDataModel, O extends object = Record<string, any>> {
    type: string;
    model: new (modelId: string, options: O, context: KosCreationContext) => T;
    childRegistration?: any;
}
export declare class KosRegistration<T extends IKosDataModel, O extends object = Record<string, any>> {
    type: string;
    childRegistration?: any;
    model: new (modelId: string, options: O, context: KosCreationContext) => T;
    constructor({ type, model, childRegistration }: RegistrationProps<T, O>);
    get factory(): (id: string) => (options?: O | undefined, parentId?: string | undefined) => T;
    get registration(): ModelRegistration<T, O>;
    get predicate(): (model: any) => model is T;
}
export {};
//# sourceMappingURL=kos-registration.d.ts.map