refactoring
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user