View Single Post
09-02-16, 11:25 AM   #7
SDPhantom
A Pyroguard Emberseer
 
SDPhantom's Avatar
AddOn Author - Click to view addons
Join Date: Jul 2006
Posts: 2,326
I might as well post mine, I have many versions of this and I don't even know if this is the latest one. I keep recreating it for every addon I need it in.

Lua Code:
  1. local Name,Addon=...;
  2.  
  3. local C_Timer_After=C_Timer.After;
  4. local next=next;
  5. local pairs=pairs;
  6. local setmetatable=setmetatable;
  7. local tostring=tostring;
  8. local type=type;
  9.  
  10. --------------------------
  11. --[[    Event Frame ]]
  12. --------------------------
  13. local function OnEvent(self,event,...)
  14.     local list=self[event];
  15.     if list and next(list) then
  16.         for funcobj in pairs(list) do funcobj[0](funcobj,event,...); end
  17.     else
  18.         self:UnregisterEvent(event);
  19.     end
  20. end
  21.  
  22. local EventFrame=CreateFrame("Frame");
  23. EventFrame:SetScript("OnEvent",OnEvent);
  24.  
  25. ------------------------------------------
  26. --[[    Callback Object Registry    ]]
  27. ------------------------------------------
  28. local CallbackMeta={__index={},__call=function(t,...) return t[0](t,...); end};
  29. local FuncObject=setmetatable({},{__index=function(t,k) local obj=setmetatable({[0]=k},CallbackMeta); t[k],t[obj]=obj,obj; return obj; end});
  30.  
  31. function CallbackMeta.__index:RegisterEvent(...)--  Obj:RegisterEvent(Event<s>) -or-    Addon.RegisterEvent(Func/Obj,Event<s>)
  32.     self=FuncObject[self];--    Make sure we have our custom object (Can be used as an AddOn API call)
  33.  
  34.     for i=1,select("#",...) do
  35.         local event=tostring(select(i,...)):upper();
  36.  
  37.         local list=EventFrame[event];
  38.         if not list then list={}; EventFrame[event]=list; end
  39.         if not list[self] then
  40.             list[self]=true;
  41.             EventFrame:RegisterEvent(event);
  42.         end
  43.     end
  44.  
  45.     return self;
  46. end
  47.  
  48. function CallbackMeta.__index:UnregisterEvent(...)--    Obj:UnregisterEvent(Event<s>)   -or-    Addon.UnregisterEvent(Func/Obj,Event<s>)
  49.     self=FuncObject[self];--    Make sure we have our custom object (Can be used as an AddOn API call)
  50.     local argcount=select("#",...);
  51.  
  52.     if argcount>0 then
  53.         for i=1,argcount do
  54.             local event=tostring(select(i,...)):upper();
  55.  
  56.             local list=EventFrame[event];
  57.             if list then
  58.                 list[self]=nil;
  59.                 if not next(list) then EventFrame:UnregisterEvent(event); end
  60.             end
  61.         end
  62.     else
  63.         for i,j in pairs(EventFrame) do
  64.             if type(j)=="table" then j[self]=nil; end
  65.         end
  66.     end
  67.  
  68.     return self;
  69. end
  70.  
  71. function CallbackMeta.__index:DelayedCall(delay) C_Timer_After(delay,self[0]); end
  72.  
  73. ----------------------------------
  74. --[[    API Registration    ]]
  75. ----------------------------------
  76. Addon.RegisterEvent=CallbackMeta.__index.RegisterEvent;
  77. Addon.UnregisterEvent=CallbackMeta.__index.UnregisterEvent;
  78. function Addon.FireEvent(event,...) OnEvent(EventFrame,tostring(event):upper(),...); end
  79. function Addon.GetCallbackObject(func) return FuncObject[func]; end
__________________
WoWInterface AddOns
"All I want is a pretty girl, a decent meal, and the right to shoot lightning at fools."
-Anders (Dragon Age: Origins - Awakening)
  Reply With Quote