-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclass.lua
72 lines (61 loc) · 1.78 KB
/
class.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
--[[
Copyright (c) 2016-2018 uscq <yuleader@163.com> All rights reserved.
Licensed under the MIT License (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at
http://opensource.org/licenses/MIT
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations.
--]]
local setclass = setmetatable
local getclass = getmetatable
local pairs = pairs
local function indexing (self, key)
if key == nil then return end
local class = getclass(self)
local t = class
repeat
local val = t[key]
if val ~= nil then
-- it would fire __newindex/__eq when appropriate
if t ~= class then class[key] = val end
self[key] = val
return val
end
t = t.__super
until not t
end
typeof = getclass
function class (super)
local drived = {
__index = indexing,
__super = super,
}
if super then
drived.__tostring = super.__tostring
drived.__gc = super.__gc
setclass(drived, { __index = super })
end
return drived
end
function new (class, ...)
local obj = setclass({ }, class)
local __ctor = class.__ctor
if __ctor then __ctor(obj, ...) end
return obj
end
function delete (obj)
local gc = obj.__gc
if gc then gc(obj) end
setclass(obj, nil)
for k in pairs(obj) do obj[k] = nil end
end
function is_a (obj, class)
local t = getclass(obj)
while t do
if t == class then return true end
t = t.__super
end
return false
end