-- shared_meters = true keep_ambiguous = true require 'unclasslib' function say(msg) print(msg and "> " .. msg or "") end print [[ > meter = class() > function meter:__init(value) > print("meter init " .. (value or 'nil')) > self.value = value or 0 > end > function meter:set(value) > self.value = value > end > function meter:read() > print("meter read " .. self.value) > return self.value > end > function meter:which() > print("meter = " .. tostring(self) .. " { value = " .. self.value .. " }") > end > meter.value = -1 ]] meter = class() function meter:__init(value) print("meter init " .. (value or 'nil')) self.value = value or 0 end function meter:set(value) self.value = value end function meter:read() print("meter read " .. self.value) return self.value end function meter:which() print("meter = " .. tostring(self) .. " { value = " .. self.value .. " }") end meter.value = -1 m = shared_meters and shared(meter) or meter mm = shared_meters and "shared(meter)" or "meter" say("hygro = class(" .. mm .. ")") hygro = class(m) print [[ > function hygro:read() > print("humidity " .. self[meter].value) > end ]] function hygro:read() print("humidity " .. self[meter].value) end say("therm = class(" .. mm .. ")") therm = class(m) print [[ > function therm:read() > print("temperature " .. self[meter].value) > end ]] function therm:read() print("temperature " .. self[meter].value) end print [[ > hygrotherm = class(hygro, therm) > function hygrotherm:read() > self[hygro]:read() > self[therm]:read() > end ]] hygrotherm = class(hygro, therm) function hygrotherm:read() self[hygro]:read() self[therm]:read() end say('ht = hygrotherm(0)') ht = hygrotherm(0) say() say("ht[therm]:set(11)") ht[therm]:set(11) say("ht[therm]:read()") ht[therm]:read() say() say("ht[hygro]:set(22)") ht[hygro]:set(22) say("ht[hygro]:read()") ht[hygro]:read() say() say("ht[therm]:read()") ht[therm]:read() say() say("ht:read()") ht:read() say() say("ht:which()") status, msg = pcall(ht.which, ht) if not status then print(msg) end function show(t) if not t or not t.__type then print("Sorry, cannot show " .. tostring(t)) return end print('__type', t.__type) for i, v in pairs(t) do if type(i) ~= 'string' or i:sub(1, 2) ~= '__' then print(i, v) end end end print() print("Class attributes:") print() print('meter:') show(meter) print() print('therm:') show(therm) print() print('hygro:') show(hygro) print() print('hygrotherm:') show(hygrotherm) print() print("ht is a meter = ", ht:is_a(meter)) print("ht is a therm = ", ht:is_a(therm)) print("ht is a hygro = ", ht:is_a(hygro)) print("ht is a hygrotherm = ", ht:is_a(hygrotherm)) print() print("Object attributes:") print() print("ht:") show(ht) print() print("ht[hygro]:") show(ht[hygro]) print() print("ht[therm]:") show(ht[therm]) print() print("ht[hygro][meter]:") show(ht[hygro][meter]) print() print("ht[therm][meter]:") show(ht[therm][meter]) print() print("ht[meter]:") status, msg = pcall(show, ht[meter]) if not status then print(msg)end