OO=require'OO' require'dump' function out(fmt, ...) print(fmt:format(unpack(arg))) end C0=OO.class{__name='C0 class'} C1=C0:subclass{__name='C1 (C0:subclass)'} C2=C1:subclass{__name='C2 (C1:subclass)'} function C0:init(a) self.a = a^a end function C1:init(b, ...) C1:super().init(self, ...) self.b = 3*b end function C2:init(c, ...) C2:super().init(self, ...) self.c = c end function C0:foo_c0(str) out('C0:foo_c0, __name=%s', self.__name) end function C1:foo_c1(str) out('C1:foo_c1, name=%s', self.__name) end function C2:foo_c2(str) out('C2:foo_c2, name=%s', self.__name) end --[[ dump(C0) dump(C1) dump(C2) --]] c0 = C0:new({__name='c0-instance'}, 8) c1 = C1:new({__name='c1-instance'}, 1, 2) c2 = C2:new({__name='c2-instance'}, 7, 6, 5) assert(c0:class() == C0) dump(c1:class(), 'c1:class()') assert(c1:class() == C1) assert(c2:class() == C2) assert(c2:super() == C1) assert(c1:super() == C0) assert(not c0:super()) assert(c2:super():super() == C0) if (c2_class ~= C2_class) then dump(c2_class) dump(C2_class) end assert(c2.a == 5^5) assert(c2.b == 3*6) assert(c2.c == 7)