hooks = class(function(self) self.events = {} end) function hooks:on(event, callback) if not self.events[event] then self.events[event] = {} end table.insert(self.events[event], callback) end function hooks:once(event, callback) local wrapper wrapper = function(...) callback(...) self:off(event, wrapper) end self:on(event, wrapper) end function hooks:off(event, callback) local list = self.events[event] if not list then return end for i, cb in ipairs(list) do if cb == callback then table.remove(list, i) return end end end function hooks:emit(event, ...) local list = self.events[event] if not list then return end for _, cb in ipairs(list) do cb(...) end end local Hooks = hooks() return Hooks