import { Type } from '@neoskop/annotation-factory'; export declare type Cls = { new?(...args: any[]): T; readonly prototype: T; }; export declare type MethodProperty = string | string[] | keyof T | keyof T[] | RegExp; export declare type Property = string | string[] | keyof T | keyof T[]; export interface InstanceMethodPointcutDecorator { (cls: Cls, property: MethodProperty): any; new (cls: Cls, property: MethodProperty): InstanceMethodPointcut; } export interface StaticMethodPointcutDecorator { (cls: T, property: MethodProperty): any; new (cls: T, property: MethodProperty): StaticMethodPointcut; } export interface InstancePropertyPointcutDecorator { (cls: Cls, property: Property): any; new (cls: Cls, property: Property): InstancePropertyPointcut; } export interface StaticPropertyPointcutDecorator { (cls: T, property: Property): any; new (cls: T, property: Property): StaticPropertyPointcut; } export declare abstract class Pointcut { abstract readonly cls: Cls | T; abstract readonly property: Property | MethodProperty; } export declare abstract class InstanceMethodPointcut extends Pointcut { abstract readonly cls: Type; abstract readonly property: MethodProperty; } export declare abstract class StaticMethodPointcut extends Pointcut { abstract readonly cls: T; abstract readonly property: MethodProperty; } export declare abstract class InstancePropertyPointcut extends Pointcut { abstract readonly cls: Type; abstract readonly property: Property; } export declare abstract class StaticPropertyPointcut extends Pointcut { abstract readonly cls: T; abstract readonly property: Property; } /** * Defines a before advice * @example * ``` * class Aspect { * @Before(ExampleClass, 'exampleMethod') * advice(jp : JoinpointContext) {} * } * ``` */ export declare const Before: InstanceMethodPointcutDecorator; /** * Defines a after advice * @example * ``` * class Aspect { * @After(ExampleClass, 'exampleMethod') * advice(jp : JoinpointContext) {} * } * ``` */ export declare const After: InstanceMethodPointcutDecorator; /** * Defines a around advice * @example * ``` * class Aspect { * @Around(ExampleClass, 'exampleMethod') * advice(jp : JoinpointContext) { * return jp.proceed() * } * } * ``` */ export declare const Around: InstanceMethodPointcutDecorator; /** * Defines a getter advice * @example * ``` * class Aspect { * @Getter(ExampleClass, 'exampleProperty') * advice(jp : GetterJoinpointContext) { * return jp.getValue() * } * } * ``` */ export declare const Getter: InstancePropertyPointcutDecorator; /** * Defines a setter advice * @example * ``` * class Aspect { * @Setter(ExampleClass, 'exampleProperty') * advice(jp : SetterJoinpointContext) { * jp.proceed() * } * } * ``` */ export declare const Setter: InstancePropertyPointcutDecorator; /** * Defines a static before advice * @example * ``` * class Aspect { * @BeforeStatic(ExampleClass, 'exampleMethod') * advice(jp : JoinpointContext) {} * } * ``` */ export declare const BeforeStatic: StaticMethodPointcutDecorator; /** * Defines a static after advice * @example * ``` * class Aspect { * @AfterStatic(ExampleClass, 'exampleMethod') * advice(jp : JoinpointContext) {} * } * ``` */ export declare const AfterStatic: StaticMethodPointcutDecorator; /** * Defines a static around advice * @example * ``` * class Aspect { * @AroundStatic(ExampleClass, 'exampleMethod') * advice(jp : JoinpointContext) { * return jp.proceed() * } * } * ``` */ export declare const AroundStatic: StaticMethodPointcutDecorator; /** * Defines a static getter advice * @example * ``` * class Aspect { * @StaticGetter(ExampleClass, 'exampleProperty') * advice(jp : GetterJoinpointContext) { * return jp.getValue() * } * } * ``` */ export declare const StaticGetter: StaticPropertyPointcutDecorator; /** * Defines a static setter advice * @example * ``` * class Aspect { * @StaticSetter(ExampleClass, 'exampleProperty') * advice(jp : SetterJoinpointContext) { * jp.proceed() * } * } * ``` */ export declare const StaticSetter: StaticPropertyPointcutDecorator; /** * Marks a method explicit as joinpoint shadow * Required for annotated methods! * @example * ``` * class Controller { * @Get('/') * @JoinpointShadow() // IMPORTANT: as last annotation! * method() { * return 'foo'; * } * } * ``` */ export declare function JoinpointShadow(): MethodDecorator;