flickerstreak@28: --[[ $Id: AceEvent-3.0.lua 60131 2008-02-03 13:03:56Z nevcairiel $ ]] flickerstreak@28: local MAJOR, MINOR = "AceEvent-3.0", 3 flickerstreak@28: local AceEvent = LibStub:NewLibrary(MAJOR, MINOR) flickerstreak@28: flickerstreak@28: if not AceEvent then return end flickerstreak@28: flickerstreak@28: local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") flickerstreak@28: flickerstreak@28: flickerstreak@28: AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame flickerstreak@28: AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib flickerstreak@28: flickerstreak@28: flickerstreak@28: -- APIs and registry for blizzard events, using CallbackHandler lib flickerstreak@28: if not AceEvent.events then flickerstreak@28: AceEvent.events = CallbackHandler:New(AceEvent, flickerstreak@28: "RegisterEvent", "UnregisterEvent", "UnregisterAllEvents") flickerstreak@28: end flickerstreak@28: flickerstreak@28: function AceEvent.events:OnUsed(target, eventname) flickerstreak@28: AceEvent.frame:RegisterEvent(eventname) flickerstreak@28: end flickerstreak@28: flickerstreak@28: function AceEvent.events:OnUnused(target, eventname) flickerstreak@28: AceEvent.frame:UnregisterEvent(eventname) flickerstreak@28: end flickerstreak@28: flickerstreak@28: flickerstreak@28: -- APIs and registry for IPC messages, using CallbackHandler lib flickerstreak@28: if not AceEvent.messages then flickerstreak@28: AceEvent.messages = CallbackHandler:New(AceEvent, flickerstreak@28: "RegisterMessage", "UnregisterMessage", "UnregisterAllMessages" flickerstreak@28: ) flickerstreak@28: AceEvent.SendMessage = AceEvent.messages.Fire flickerstreak@28: end flickerstreak@28: flickerstreak@28: --- embedding and embed handling flickerstreak@28: local mixins = { flickerstreak@28: "RegisterEvent", "UnregisterEvent", flickerstreak@28: "RegisterMessage", "UnregisterMessage", flickerstreak@28: "SendMessage", flickerstreak@28: "UnregisterAllEvents", "UnregisterAllMessages", flickerstreak@28: } flickerstreak@28: flickerstreak@28: -- AceEvent:Embed( target ) flickerstreak@28: -- target (object) - target object to embed AceEvent in flickerstreak@28: -- flickerstreak@28: -- Embeds AceEvent into the target object making the functions from the mixins list available on target:.. flickerstreak@28: function AceEvent:Embed(target) flickerstreak@28: for k, v in pairs(mixins) do flickerstreak@28: target[v] = self[v] flickerstreak@28: end flickerstreak@28: self.embeds[target] = true flickerstreak@28: return target flickerstreak@28: end flickerstreak@28: flickerstreak@28: -- AceEvent:OnEmbedDisable( target ) flickerstreak@28: -- target (object) - target object that is being disabled flickerstreak@28: -- flickerstreak@28: -- Unregister all events messages etc when the target disables. flickerstreak@28: -- this method should be called by the target manually or by an addon framework flickerstreak@28: function AceEvent:OnEmbedDisable(target) flickerstreak@28: target:UnregisterAllEvents() flickerstreak@28: target:UnregisterAllMessages() flickerstreak@28: end flickerstreak@28: flickerstreak@28: -- Script to fire blizzard events into the event listeners flickerstreak@28: local events = AceEvent.events flickerstreak@28: AceEvent.frame:SetScript("OnEvent", function(this, event, ...) flickerstreak@28: events:Fire(event, ...) flickerstreak@28: end) flickerstreak@28: flickerstreak@28: --- Finally: upgrade our old embeds flickerstreak@28: for target, v in pairs(AceEvent.embeds) do flickerstreak@28: AceEvent:Embed(target) flickerstreak@28: end