vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
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