···11+Hooks = class(function(self)
22+ self.events = {}
33+end)
44+55+function Hooks:on(event, callback)
66+ if not self.events[event] then
77+ self.events[event] = {}
88+ end
99+1010+ table.insert(self.events[event], callback)
1111+end
1212+1313+function Hooks:once(event, callback)
1414+ local wrapper
1515+ wrapper = function(...)
1616+ callback(...)
1717+ self:off(event, wrapper)
1818+ end
1919+2020+ self:on(event, wrapper)
2121+end
2222+2323+function Hooks:off(event, callback)
2424+ local list = self.events[event]
2525+ if not list then return end
2626+ for i, cb in ipairs(list) do
2727+ if cb == callback then
2828+ table.remove(list, i)
2929+ return
3030+ end
3131+ end
3232+end
3333+3434+function Hooks:emit(event, ...)
3535+ local list = self.events[event]
3636+ if not list then return end
3737+ for _, cb in ipairs(list) do
3838+ cb(...)
3939+ end
4040+end
4141+4242+return Hooks