40 lines
1.1 KiB
Lua
40 lines
1.1 KiB
Lua
if module then return end
|
|
local _G, setfenv, setmetatable = getfenv(0), setfenv, setmetatable
|
|
local loaded = {}
|
|
|
|
local function nop() end
|
|
|
|
local function create_module(name)
|
|
local environment, public_fields = setmetatable({}, {__index=_G}), {}
|
|
local public_modifier = setmetatable({}, {
|
|
__metatable=false,
|
|
__newindex=function(_, k, v)
|
|
environment[k], public_fields[k] = v, v
|
|
end,
|
|
})
|
|
environment._G, environment.nop, environment._M, environment.M = _G, nop, environment, public_modifier
|
|
environment.include = function(name)
|
|
local P = loaded[name] or error('No such module.', 2)
|
|
for k, v in P.public_fields do
|
|
environment[k] = v
|
|
end
|
|
end
|
|
local interface = setmetatable({}, {__metatable=false, __index=public_fields, __newindex=nop})
|
|
local P = {environment=environment, public_fields=public_fields, interface=interface}
|
|
loaded[name] = P
|
|
return P
|
|
end
|
|
|
|
function module(name)
|
|
local defined = loaded[name] and true or false
|
|
if not defined then
|
|
create_module(name)
|
|
end
|
|
setfenv(2, loaded[name].environment)
|
|
return defined
|
|
end
|
|
|
|
function require(name)
|
|
local P = loaded[name]
|
|
return P and P.interface
|
|
end |