files/examples/classlib/nsingle.lua
require 'classlib'

print [[
> class.A()
> function A:__init(s) self.s = s end
> function A:ps() print(self.s) end

> class.B(A)
> function B:__init(s, s1)
> 	self.A:__init(s)
> 	self.s1 = s1
> end
> function B:ps1() print(self.s1) end

> class.C(B)
> function C:__init(s, s1, s2)
> 	self[B]:__init(s, s1)
> 	self.s2 = s2
> end
> function C:ps2() print(self.s2) end

> class.D(A)	-- no constructor, initialize A by default constructor.
]]

class.A()
function A:__init(s) self.s = s end
function A:ps() print(self.s) end

class.B(A)
function B:__init(s, s1)
	self.A:__init(s)
	self.s1 = s1
end
function B:ps1() print(self.s1) end

class.C(B)
function C:__init(s, s1, s2)
	self.B:__init(s, s1)
	self.s2 = s2
end
function C:ps2() print(self.s2) end

class.D(A)	-- no constructor, initialize A by default constructor.

print [[
> a = A("a")
> a:ps()
> print(a:is_a(A))
> print(a:is_a(B))
> print(a:is_a(C))
> print(a:is_a(D))
]]

a = A("a")
a:ps()
print(a:is_a(A))
print(a:is_a(B))
print(a:is_a(C))
print(a:is_a(D))

print [[

> b = B("b", "b1")
> b:ps()
> b:ps1()
> print(b:is_a(A))
> print(b:is_a(B))
> print(b:is_a(C))
> print(b:is_a(D))
]]

b = B("b", "b1")
b:ps()
b:ps1()
print(b:is_a(A))
print(b:is_a(B))
print(b:is_a(C))
print(b:is_a(D))

print [[

> c = C("c", "c1", "c2")
> c:ps()
> c:ps1()
> c:ps2()
> print(c:is_a(A))
> print(c:is_a(B))
> print(c:is_a(C))
> print(c:is_a(D))
]]

c = C("c", "c1", "c2")
c:ps()
c:ps1()
c:ps2()
print(c:is_a(A))
print(c:is_a(B))
print(c:is_a(C))
print(c:is_a(D))

print [[

> d = D("d", "extra")
> d:ps()
> print(d:is_a(A))
> print(d:is_a(B))
> print(d:is_a(C))
> print(d:is_a(D))
]]

d = D("d", "extra")
d:ps()
print(d:is_a(A))
print(d:is_a(B))
print(d:is_a(C))
print(d:is_a(D))
