local Event = {} local function Disconnect(connection) local event = connection.event for i, v in ipairs(event) do if v == connection then table.remove(event, i) break end end end local function Connect(event, f, ...) local connection = {event = event, f = f, Disconnect = Disconnect} table.insert(event, connection) return connection end local function PreFire(event, ...) for i, v in ipairs(event) do v.f(...) end end local function Fire(event, ...) event.bindable:Fire() for i, v in ipairs(event) do v.f(...) end end local function Wait(event) event.bindable.Event:Wait() end local function PreWait(event) event.bindable = Instance.new("BindableEvent"); event.Wait = Wait event.Fire = Fire event:Wait() end Event.new = function() local event = { Connect = Connect; Fire = PreFire; Wait = PreWait; } return event end return Event