export declare function observe<TArgs extends any[], TReturn>(fn: (...args: TArgs) => TReturn, executeBefore?: ((context: MiddlewareContext, ...args: TArgs) => TArgs)[], executeAfter?: ((context: MiddlewareContext, result: TReturn) => TReturn)[], context?: MiddlewareContext): (...args: TArgs) => TReturn;
export interface MiddlewareContext {
    /** The kind of element being decorated ('function', 'method', 'getter', 'setter', 'class'). */
    kind: 'function' | 'method' | 'getter' | 'setter' | 'class';
    /** The name of the method, accessor, or class. */
    name: string | symbol;
    /** The target object (prototype for instance members, constructor for static members/class). */
    target: Function | Object;
}
export type MethodArgsMiddleware<TArgs extends any[]> = (this: any, context: MiddlewareContext, ...args: TArgs) => TArgs;
export type MethodResultMiddleware<TReturn> = (this: any, context: MiddlewareContext, result: TReturn) => TReturn;
export type ConstructorArgsMiddleware<TArgs extends any[]> = (this: null, context: MiddlewareContext, ...args: TArgs) => TArgs;
export type ConstructorInstanceMiddleware<TInstance> = (this: TInstance, context: MiddlewareContext, instance: TInstance) => TInstance | void;
export type AccessorGetArgMiddleware = (MethodArgsMiddleware<any>);
export type AccessorGetResultMiddleware<TReturn> = (this: any, context: MiddlewareContext, result: TReturn) => TReturn;
export type AccessorSetArgMiddleware<TVal> = (this: any, context: MiddlewareContext, value: TVal) => TVal;
export type AccessorSetResultMiddleware = MethodResultMiddleware<void>;
export declare function ObserveMethod(config?: {
    beforeArgs?: MethodArgsMiddleware<any[]>[];
    afterResult?: MethodResultMiddleware<any>[];
}): MethodDecorator;
export declare function ObserveAccessor(config?: {
    beforeGet?: AccessorGetArgMiddleware[];
    afterGet?: AccessorGetResultMiddleware<any>[];
    beforeSet?: AccessorSetArgMiddleware<any>[];
    afterSet?: AccessorSetResultMiddleware[];
}): MethodDecorator;
export declare function ObserveClass(config?: {
    beforeArgs?: ConstructorArgsMiddleware<any[]>[];
    afterInstance?: ConstructorInstanceMiddleware<any>[];
}): ClassDecorator;
