Originally Posted by Phanx
If I'm writing a simple "delay for ADDON_LOADED or PLAYER_LOGIN" frame that only handles that one event by design, I would never add an event check, since it's blatantly obvious that the frame is only handling one event and will only ever handle one event. Adding an event check in this type of code just wastes (imaginary) CPU time and adds useless clutter. I'd argue that the clutter aspect actually makes your code harder to maintain, since when you come back and look at it and see an event check, you assume it must be able to handle other events, and then are confused as to why the hell you included an event check on a frame that only handles one event.
|
^This
The following has somewhat been my personal boilerplate for several years (inspired by several genious people, AFAIK that includes tekkub, haste and p3lim, among others...)
lua Code:
-- events.lua
local addon_name, addon = ...
local event_frame = CreateFrame("Frame")
event_frame:SetScript("onevent", function(self, event, ...)
if addon[event] then
addon[event](addon, ...)
else
error(addon_name, "unhandled event:", event, ...)
end
end)
function addon:RegisterEvent(event, function)
event_frame:RegisterEvent(event)
if function and not addon[event] then
addon[event] = function
-- elseif function then
-- error(addon_name, "attempt to register handler: handler already exists for event ", event)
end
end
function addon:RegisterEvents(function, event, ...)
if event then
self:RegisterEvent(event, function)
self:RegisterEvents(function, ...)
end
end
function addon:UnregisterEvent(event, ...)
if event then
event_frame:UnregisterEvent(event)
self:UnregisterEvent(...)
end
end
addon.UnregisterEvents = addon.UnregisterEvent
function addon:KillEvents(event, ...)
self:UnregisterEvents(event, ...)
if event then
self[event] = nil
self:KillEvents(...)
end
end
addon.KillEvent = addon.KillEvent
lua Code:
-- core.lua
local addon_name, addon = ...
function addon:PLAYER_LOGIN()
-- on login (saved variables loaded + spellbook ready, etc...)
self:KillEvent("PLAYER_LOGIN")
end
addon:RegisterEvent("ADDON_LOADED", function(loaded_addon)
if addon_name ~= loaded_addon then return end
self:KillEvent("ADDON_LOADED")
-- on initialize (saved variables loaded)
if IsLoggedIn() then
self:PLAYER_LOGIN()
else
self:RegisterEvent("PAYER_LOGIN")
end
end)
I'm not saying you should or should always use this method, as it probably contains errors and it has both disadvantages and advantages, if you have a lot of events to register for, then for readability, you
could use this method.