module refactoring
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
if module then return end
|
||||
local _G, setfenv, setmetatable = getfenv(0), setfenv, setmetatable
|
||||
local environments, interfaces = {}, {}
|
||||
|
||||
local function pass() end
|
||||
|
||||
local environment_mt = {__index=_G}
|
||||
|
||||
local function create_module(name)
|
||||
local environment = setmetatable({_G=_G, pass=pass}, environment_mt)
|
||||
local exports = {}
|
||||
environment.M = setmetatable({}, {
|
||||
__metatable=false,
|
||||
__newindex=function(_, k, v)
|
||||
environment[k], exports[k] = v, v
|
||||
end,
|
||||
})
|
||||
environment._M = environment
|
||||
environments[name] = environment
|
||||
interfaces[name] = setmetatable({}, {__metatable=false, __index=exports, __newindex=pass})
|
||||
end
|
||||
|
||||
function module(name)
|
||||
local defined = not not environments[name]
|
||||
if not defined then
|
||||
create_module(name)
|
||||
end
|
||||
setfenv(2, environments[name])
|
||||
return defined
|
||||
end
|
||||
|
||||
function require(name)
|
||||
return interfaces[name]
|
||||
end
|
||||
Reference in New Issue
Block a user