-
Notifications
You must be signed in to change notification settings - Fork 16
/
object.lua
82 lines (75 loc) · 1.81 KB
/
object.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
------------------------------------------------------------------------------
-- Object core module
--
-- LICENSE: http://opensource.org/licenses/MIT
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
-- require("object")
-- o = object({ a = 1 })
-- o:on("data", function(self, data) print("DATA", data, self.a) end)
-- o:emit("data", "b")
------------------------------------------------------------------------------
-- attach event handler
local addEventHandler = function(self, event, handler)
-- TODO: multiple?
self._handlers[event] = handler
end
-- remove event handler
local removeEventHandler = function(self, event, handler)
-- TODO: multiple?
self._handlers[event] = nil
end
-- emit event
local emit = function(self, event, ...)
local handler = self._handlers[event]
-- TODO: multiple?
if handler then
handler(self, ...)
end
end
-- attach one-time (optionally expiring) event handler
local once = function(self, event, handler, timeout)
local fired
self:addEventHandler(event, function(self, ...)
if not fired then
fired = true
handler(self, ...)
end
self:removeEventHandler(event, handler)
end)
if timeout then
setTimeout(timeout, function()
if not fired then
fired = true
handler(self, "expired")
end
self:removeEventHandler(event, handler)
end)
end
end
local meta = {
__index = {
addEventHandler = addEventHandler,
emit = emit,
on = addEventHandler,
once = once,
removeEventHandler = removeEventHandler,
},
-- __newindex = function(t, k, v)
-- if t._handlers
-- end,
}
function object(t)
local self = setmetatable(t or { }, {
__index = setmetatable({
_handlers = { },
}, meta)
})
return self
end
function extend(o, t)
return setmetatable(t or {}, {
__index = o,
})
end