import { Model } from './model';
import { ISchemaInstance, Path } from './schema/schema';
export interface IChangeHookOptions<TModel extends Model> {
    path: Path;
    value: any;
    modelInstance: TModel;
    schemaInstance: ISchemaInstance;
}
export interface IChangeHooks<TModel extends Model = Model> {
    beforeChange?(options: IChangeHookOptions<TModel>): any;
    afterChange?(options: IChangeHookOptions<TModel>): any;
}
export declare type IHooks<TModel extends Model = Model> = IChangeHooks<TModel>;
export interface IHookOptionsMap<TModel extends Model> {
    beforeChange: IChangeHookOptions<TModel>;
    afterChange: IChangeHookOptions<TModel>;
}
export declare type hookHandlers<TOptions> = Array<(options: TOptions) => void>;
export declare type HookHandlersMap<TModel extends Model> = {
    [k in keyof IHookOptionsMap<TModel>]: hookHandlers<IHookOptionsMap<TModel>[k]>;
};
export declare class Hooks<TModel extends Model> {
    private handlers;
    constructor(hooks?: Hooks<TModel>);
    register<K extends keyof HookHandlersMap<TModel>>(name: K, handler: HookHandlersMap<TModel>[K][0]): void;
    run<K extends keyof IHookOptionsMap<TModel>>(name: K, options: IHookOptionsMap<TModel>[K]): void;
}
