local lib, oldminor = LibStub:NewLibrary("zzAddOn", 2) if not lib then return end oldminor = oldminor or 0 lib['callbacks'] = lib['callbacks'] or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib) lib['addons'] = lib['addons'] or {} lib['events'] = lib['events'] or CreateFrame("FRAME") local mixins = {'RegisterEvent','UnregisterEvent','IsClassic', 'GetSpecs'} local events = lib['events'] function lib:GetSpecs(childName) if(self['specs']) then return self['specs'][childName] end end function lib:RegisterEvent(event) if(type(event) == 'table') then for ev, func in pairs(event) do -- print("[zza] Registertab CB", type(ev),ev) if(type(ev) == 'string' and type(func) == 'function' and not self['events'][ev]) then self['events'][ev] = func end self:RegisterEvent(ev) end elseif(type(event) == 'string') then -- print("[zza] Register CB", type(event),event) if(not lib['events']:IsEventRegistered(event)) then lib['events']:RegisterEvent(event) end lib['RegisterCallback'](self['events'], event) else print("ign reg", type(event), event) end end function lib:UnregisterEvent(event) if(type(event) == 'table') then for key, ev in pairs(event) do self:UnregisterEvent(ev) end else lib['UnregisterCallback'](self['events'], event) end end function lib:IsClassic() return WOW_PROJECT_ID == WOW_PROJECT_CLASSIC end function lib:NewAddOn(specs, addonName, addonTable) local childName = specs['name'] addonTable['parentName'] = addonName addonTable['specs'] = addonTable['specs'] or {} addonTable['specs'][childName] = specs if(type(childName) == 'string') then lib['addons'][childName] = addonTable lib:Embed(addonTable) if(addonTable['events']) then for ev, func in pairs(addonTable['events']) do if(type(func) == 'function') then -- print("[zza] Register", ev) addonTable:RegisterEvent(ev) end end end return lib['addons'][childName] end end function lib:Embed(target) for _,name in pairs(mixins) do target[name] = lib[name] end end for target, _ in pairs(lib['addons']) do lib:Embed(target) end lib['events']:RegisterEvent('ADDON_LOADED') lib['events']:SetScript("OnEvent", function(self, event, ...) -- print("[zza]", self, event, ...) local addonName = ... local addon = lib['addons'][addonName] if(addon) then if(event == 'ADDON_LOADED') then local specs = addon:GetSpecs(addonName) if(specs and specs['sv'] and not addon['db']) then -- print('dbname',type(specs['sv']),type(specs['sv']) == 'boolean' and addonName or specs['sv']) local dbname = format('%sDB', type(specs['sv']) == 'boolean' and addonName or specs['sv']) addon['db'] = LibStub("AceDB-3.0"):New(dbname, type(specs['defaults']) == 'table' and specs['defaults'] or {}, 'Default') if(specs['ldb']) then local ldbobj = LibStub:GetLibrary("zzLDB"):AddLDB(specs['name'], specs['ldb'], addon['db']) end if(specs['cfg']) then local config = LibStub:GetLibrary("zzConfig") addon['options'] = config:InitConfig(addon, addonName) addon['options']['args']['profile'] = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon['db']) if(type(specs['cfgReset']) == 'function') then addon['db'].RegisterCallback(specs, "OnProfileReset", 'cfgReset') end end end end end -- print("[zza] Fire", event, ...) lib['callbacks']:Fire(event, ...) end)