module refactoring

This commit is contained in:
Manuel Simon Hirsig
2017-11-25 17:53:10 +01:00
parent 6f71167e48
commit ab94acc2be
38 changed files with 402 additions and 453 deletions
+34
View File
@@ -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