Quantcast
local NAME, ADDON = ...

ADDON.events = CreateFrame('FRAME')

local events = ADDON.events
events.list = {}

events:SetScript('OnEvent', function(self, event, ...)
    self:Fire(event, ...)
end)

function events:Fire(event, ...)
    if not event or not self.list[event] then return end

    for obj in pairs(self.list[event]) do
        obj[event](obj, ...)
    end
end

function events:Add(event, obj)
    if not event or not obj or not obj[event] then return end

    if not self.list[event] then
        self.list[event] = {}

        self:RegisterEvent(event)
    end

    self.list[event][obj] = true
end

function events:Remove(event, obj)
    if not event or not obj or not self.list[event] or not self.list[event][obj] then return end

    self.list[event][obj] = nil

    if next(self.list[event]) == nil and ADDON:Count(self.list[event]) == 0 then
        self.list[event] = nil
        self:UnregisterEvent(event)
    end
end