comparison Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua @ 22:3596dadf9a90 v8.1.0.022

- ToC and Libraries update.
author Tercioo
date Mon, 31 Dec 2018 11:30:31 -0200
parents 371e14cd2feb
children
comparison
equal deleted inserted replaced
21:f29a995e98e3 22:3596dadf9a90
1 --[[ $Id: CallbackHandler-1.0.lua 1131 2015-06-04 07:29:24Z nevcairiel $ ]] 1 --[[ $Id: CallbackHandler-1.0.lua 22 2018-07-21 14:17:22Z nevcairiel $ ]]
2 local MAJOR, MINOR = "CallbackHandler-1.0", 6 2 local MAJOR, MINOR = "CallbackHandler-1.0", 7
3 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) 3 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
4 4
5 if not CallbackHandler then return end -- No upgrade needed 5 if not CallbackHandler then return end -- No upgrade needed
6 6
7 local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} 7 local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
20 20
21 local function errorhandler(err) 21 local function errorhandler(err)
22 return geterrorhandler()(err) 22 return geterrorhandler()(err)
23 end 23 end
24 24
25 local function CreateDispatcher(argCount) 25 local function Dispatch(handlers, ...)
26 local code = [[ 26 local index, method = next(handlers)
27 local next, xpcall, eh = ... 27 if not method then return end
28 28 repeat
29 local method, ARGS 29 xpcall(method, errorhandler, ...)
30 local function call() method(ARGS) end 30 index, method = next(handlers, index)
31 31 until not method
32 local function dispatch(handlers, ...)
33 local index
34 index, method = next(handlers)
35 if not method then return end
36 local OLD_ARGS = ARGS
37 ARGS = ...
38 repeat
39 xpcall(call, eh)
40 index, method = next(handlers, index)
41 until not method
42 ARGS = OLD_ARGS
43 end
44
45 return dispatch
46 ]]
47
48 local ARGS, OLD_ARGS = {}, {}
49 for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
50 code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
51 return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
52 end 32 end
53
54 local Dispatchers = setmetatable({}, {__index=function(self, argCount)
55 local dispatcher = CreateDispatcher(argCount)
56 rawset(self, argCount, dispatcher)
57 return dispatcher
58 end})
59 33
60 -------------------------------------------------------------------------- 34 --------------------------------------------------------------------------
61 -- CallbackHandler:New 35 -- CallbackHandler:New
62 -- 36 --
63 -- target - target object to embed public APIs in 37 -- target - target object to embed public APIs in
85 function registry:Fire(eventname, ...) 59 function registry:Fire(eventname, ...)
86 if not rawget(events, eventname) or not next(events[eventname]) then return end 60 if not rawget(events, eventname) or not next(events[eventname]) then return end
87 local oldrecurse = registry.recurse 61 local oldrecurse = registry.recurse
88 registry.recurse = oldrecurse + 1 62 registry.recurse = oldrecurse + 1
89 63
90 Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...) 64 Dispatch(events[eventname], eventname, ...)
91 65
92 registry.recurse = oldrecurse 66 registry.recurse = oldrecurse
93 67
94 if registry.insertQueue and oldrecurse==0 then 68 if registry.insertQueue and oldrecurse==0 then
95 -- Something in one of our callbacks wanted to register more callbacks; they got queued 69 -- Something in one of our callbacks wanted to register more callbacks; they got queued