diff --git a/util.lua b/util.lua index 3e6f603..af1ad9d 100644 --- a/util.lua +++ b/util.lua @@ -1,7 +1,7 @@ module 'aux' do - local classes, interfaces, objects = {}, {}, setmetatable({}, {__mode='k'}) + local classes, constructors, interfaces, objects = {}, {}, {}, setmetatable({}, {__mode='k'}) local private_mt = {__metatable=false} function private_mt:__newindex(k, v) classes[self][k] = v @@ -10,21 +10,26 @@ do function public_mt:__newindex(k, v) classes[self][k] = v interfaces[self][k] = function(self, ...) - return classes[self][k](objects[self][k], unpack(arg)) + return classes[self][k](objects[self], unpack(arg)) end end - local proxy_mt = {__metatable=false} + local proxy_mt = {__metatable=false, __newindex=nop} function proxy_mt:__call() - local proxy = setmetatable({}, {__metatable=false, __index=interfaces[self]}) - objects[proxy] = setmetatable({}, {__index=classes[self]}) - return proxy + local object = setmetatable({}, {__metatable=false, __newindex=nop, __index=interfaces[self]}) + classes[object] = classes[self] + objects[object] = setmetatable({}, {__index=classes[self]}) + constructors[self](objects[object]) + return object end function M.class() local class, interface = {}, {} local private, public, proxy = setmetatable({}, private_mt), setmetatable({}, public_mt), setmetatable({}, proxy_mt) classes[private], classes[public], classes[proxy] = class, class, class interfaces[public], interfaces[proxy] = interface, interface - return private, public, proxy + return private, public, function(constructor) + constructors[proxy] = constructor or nop + return proxy + end end end