View difference between Paste ID: v2tAcFnq and pJjhNBmV
SHOW: | | - or go back to the newest paste.
1
function class(constructor)
2
    namespace = {}
3
    namespace.__index = namespace
4
    namespace.new = function(...)
5
        local outerSelf = self
6
        -- aliases
7
        local this = {}
8
        self = this
9
        -- finish
10
        setmetatable(this,namespace)
11
        constructor(unpack(arg))
12
        self = outerSelf -- used to allow constructors inside constructors
13
        return this
14
    end
15
    return namespace
16
end
17
18
-- I COULD MAKE class(namespace,extend,constructor) but new function name is clearer
19
function classExtends(extend,constructor)
20
    namespace = {}
21
    namespace.__index = namespace
22
    namespace.new = function(...)
23
        local outerSelf = self
24
        -- aliases
25
        local this = extend.new()
26
        self = this
27
        -- finish
28
        setmetatable(this,namespace)
29
        constructor(unpack(arg))
30
        self = outerSelf -- used to allow constructors inside constructors
31
        return this
32
    end
33
    return namespace
34
end
35
36
----------
37
-- TEST --
38
----------
39
Test = class(function()
40
    self.a = 1
41
    self.b = 3
42
43
    function self:set_a(new_a)
44
        self.a = new_a
45
    end
46
end)
47
48
App = classExtends(Test, function(c)
49
    print(self.a, self.b, c)
50
end)
51
52
local o = App.new(6)
53
o:set_a(2)
54
print(o.a)
55
App.new(7)