vanilla-wow-addons – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | |
2 | -- Class creation |
||
3 | AceScript = AceCore:new({registry={}}) |
||
4 | |||
5 | function AceScript:Hook(app, target, handler, method) |
||
6 | if( not self.registry[target] ) then self.registry[target] = {} end |
||
7 | if( not self.registry[target][handler] ) then |
||
8 | self.registry[target][handler] = |
||
9 | {hooks={},stack={},orig=target:GetScript(handler),nocall=0} |
||
10 | end |
||
11 | |||
12 | -- Don't multi-hook |
||
13 | if( self.registry[target][handler].hooks[app] ) then return end |
||
14 | |||
15 | target:SetScript(handler, |
||
16 | function(...) |
||
17 | if( getn(arg) ) then |
||
18 | app[method or handler](app, unpack(arg)) |
||
19 | else |
||
20 | app[method or handler](app) |
||
21 | end |
||
22 | end |
||
23 | ) |
||
24 | self.registry[target][handler].hooks[app] = TRUE |
||
25 | tinsert(self.registry[target][handler].stack, |
||
26 | {app=app, meth=method or handler, nocall=nocall} |
||
27 | ) |
||
28 | end |
||
29 | |||
30 | function AceScript:Unhook(app, target, handler) |
||
31 | if( (not self.registry[target]) or (not self.registry[target][handler]) ) then return end |
||
32 | |||
33 | local i = ace.TableFindByKeyValue(self.registry[target][handler].stack, "app", app) |
||
34 | |||
35 | if( not i ) then return end |
||
36 | |||
37 | local def = self.registry[target][handler] |
||
38 | |||
39 | if( i == getn(def.stack) ) then |
||
40 | if( i > 1 ) then |
||
41 | local app = def.stack[i-1].app |
||
42 | local meth = def.stack[i-1].meth |
||
43 | target:SetScript(handler, |
||
44 | function(...) |
||
45 | if( getn(arg) ) then |
||
46 | app[method or handler](app, unpack(arg)) |
||
47 | else |
||
48 | app[method or handler](app) |
||
49 | end |
||
50 | end |
||
51 | ) |
||
52 | if( def.stack[i].nocall ) then def.nocall = def.nocall - 1 end |
||
53 | tremove(def.stack, i) |
||
54 | def.hooks[app] = nil |
||
55 | else |
||
56 | -- If the stack is less than 1, that means it is being emptied out, so |
||
57 | -- reinstate it and clear it from the hook list. |
||
58 | target:SetScript(handler, def.orig) |
||
59 | def.nocall = 0 |
||
60 | self.registry[target][handler] = nil |
||
61 | end |
||
62 | else |
||
63 | tremove(def.stack, i) |
||
64 | def.hooks[app] = nil |
||
65 | end |
||
66 | end |
||
67 | |||
68 | function AceScript:UnhookAll(app) |
||
69 | for target in self.registry do |
||
70 | for handler in self.registry[target] do |
||
71 | self:Unhook(app, target, handler) |
||
72 | end |
||
73 | end |
||
74 | end |
||
75 | |||
76 | function AceScript:Call(app, target, handler, ...) |
||
77 | if( (not self.registry[target]) or (not self.registry[target][handler]) ) then |
||
78 | error("There is no script to call for "..handler..".", 2) |
||
79 | end |
||
80 | |||
81 | local def = self.registry[target][handler] |
||
82 | local i = ace.TableFindByKeyValue(def.stack, "app", app) |
||
83 | |||
84 | if( ace.tonum(i) > 1 ) then |
||
85 | return def.stack[i-1].app[def.stack[i-1].meth](def.stack[i-1].app, unpack(arg)) |
||
86 | elseif( def.nocall > 0 ) then |
||
87 | return |
||
88 | elseif( def.orig ) then |
||
89 | return def.orig(unpack(arg)) |
||
90 | end |
||
91 | end |
||
92 | |||
93 | |||
94 | ace.script = AceScript |