-
Notifications
You must be signed in to change notification settings - Fork 37
/
join_point.ts
59 lines (52 loc) · 1.71 KB
/
join_point.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { Advice } from './advice';
import { Metadata, MethodMetadata } from './metadata';
export interface Precondition {
assert(data: any): boolean;
}
export abstract class JointPoint {
constructor(public precondition: Precondition) {}
public abstract match(descriptor: Function): string[];
protected abstract getTarget(fn: Function): Object;
protected abstract woveTarget(target: Object, match: string, advice: Advice, woveMetadata: any): void;
public wove(
{ fn, matches, woveMetadata }: { fn: Function; matches: string[]; woveMetadata: any },
advice: Advice
): void {
const target = this.getTarget(fn);
matches.forEach((match: string) => {
this.woveTarget(target, match, advice, woveMetadata);
});
}
protected getMetadata(
className: string,
key: string,
fn: Function,
args: IArguments,
context: any,
woveMetadata: any
): Metadata {
var invocation: MethodMetadata = {
name: key,
proceed: true,
context: context,
result: undefined,
exception: undefined,
args: undefined,
invoke: fn.bind(context),
};
var metadata: Metadata = new Metadata();
metadata.method = invocation;
metadata.className = className;
metadata.woveMetadata = woveMetadata;
if (args[0] && args[0].__advice_metadata__) {
let previousMetadata = <Metadata>args[0];
metadata.method.result = previousMetadata.method.result;
metadata.method.proceed = previousMetadata.method.proceed;
metadata.method.args = previousMetadata.method.args;
metadata.method.context = previousMetadata.method.context;
} else {
metadata.method.args = Array.prototype.slice.call(args);
}
return metadata;
}
}