local function np ()
local p = newproxy(true)
debug.getmetatable(p).__gc = function () print "panel collected" end
return p
end
function class(name)
local newclass={}
_G[name]=newclass
newclass.__members={}
function newclass.define(class,members)
for k,v in pairs(members) do
class.__members[k]=v
end
end
function newclass.extends(class,base)
class.super=base
for k,v in pairs(base.__members) do
class.__members[k]=v
end
return setmetatable(class,{__index=base,__call=class.define})
end
function newclass.new(class,...)
local object={}
for k,v in pairs(class.__members) do
object[k]=v
end
setmetatable(object,{__index=class})
if object.initialize then
object:initialize(...)
end
return object
end
return setmetatable(newclass,{__call=newclass.define})
end
-----
class "Entity" { }
class "Panel": extends(Entity) { }
function Panel:initialize (ud)
self.ud = ud
end
-----
local m = { }
for i = 1, 5 do
m[i] = Panel:new(np())
end
collectgarbage "collect" -- should not collect them
print("before:", collectgarbage "count")
m = nil
collectgarbage "collect" -- should collect them
print("after:", collectgarbage "count")
print "END"