Quantcast
local ADDON_NAME, ADDON = ...

local eventManager = CreateFrame('FRAME')
ADDON.eventManager = eventManager
eventManager.events = {}

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

function eventManager:Add(event, object)
    assert(event, 'Event required')
    assert(object, 'Object required')
    assert(object[event], 'Object requires event method ' .. event)

    if not self.events[event] then
        self.events[event] = {}
        self:RegisterEvent(event)
    end

    self.events[event][object] = true
end

function eventManager:Fire(event, ...)
    assert(event, 'No event to look for')
    -- assert(self.events[event], 'No object registered for event ' .. event) Rather change this to a warning

    if self.events[event] then
        for object in pairs(self.events[event]) do
            object[event](object, ...)
        end
    end
end

local function Count(table)
    local cnt = 0;

    for _ in pairs(table) do
        cnt = cnt + 1
    end

    return cnt
end

function eventManager:Remove(event, object)
    assert(event, 'Event required')
    assert(object, 'Object required')

    self.events[event][object] = nil

    if next(self.events[event]) == nil and Count(self.events[event]) == 0 then
        self.events[event] = nil

        self:UnregisterEvent(event)
    end
end