You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
local Evie, easy, next, securecall, pcall, _, T = {}, newproxy(true), next, securecall, pcall, ...
|
|
local frame, listeners, locked, easy_mt = CreateFrame("Frame"), {}, {}, getmetatable(easy)
|
|
|
|
local function Register(event, func, depth)
|
|
if type(event) ~= "string" or type(func) ~= "function" then
|
|
error('Syntax: RegisterEvent("event", handlerFunction)', type(depth) == "number" and depth or 2)
|
|
end
|
|
local lock = locked[event]
|
|
if lock == true then
|
|
locked[event] = {[func] = 1}
|
|
elseif lock then
|
|
lock[func] = 1
|
|
else
|
|
pcall(frame.RegisterEvent, frame, event)
|
|
listeners[event] = listeners[event] or {}
|
|
listeners[event][func] = 1
|
|
end
|
|
end
|
|
local function Unregister(event, func)
|
|
local list, lock = listeners[event], locked[event]
|
|
if list and list[func] then
|
|
list[func] = nil
|
|
if not next(list) then
|
|
listeners[event] = nil
|
|
pcall(frame.UnregisterEvent, frame, event)
|
|
end
|
|
end
|
|
if lock and lock ~= true then
|
|
lock[func] = nil
|
|
end
|
|
end
|
|
local function Raise(_, event, ...)
|
|
if listeners[event] then
|
|
local lock = locked[event]
|
|
locked[event] = lock or true
|
|
for kf in next, listeners[event] do
|
|
if securecall(kf, event, ...) == "remove" then
|
|
Unregister(event, kf)
|
|
end
|
|
end
|
|
if not lock then
|
|
lock, locked[event] = locked[event]
|
|
if lock ~= true then
|
|
for kf in next, lock do
|
|
Register(event, kf)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function Evie.RaiseEvent(event, ...)
|
|
return Raise(nil, event, ...)
|
|
end
|
|
function easy_mt:__newindex(e, f)
|
|
Register(e, f, 3)
|
|
end
|
|
|
|
frame:SetScript("OnEvent", Raise)
|
|
easy_mt.__call, easy_mt.__index, Evie.raw, Evie.After = Raise, Evie, Evie, C_Timer.After
|
|
T.Evie, Evie.RegisterEvent, Evie.UnregisterEvent = easy, Register, Unregister
|