Update module.lua
This commit is contained in:
+14
-24
@@ -1,36 +1,26 @@
|
|||||||
if module then return end
|
if module then return end
|
||||||
local _G, setfenv, setmetatable, rawget = getfenv(0), setfenv, setmetatable, rawget
|
local _G, setfenv, setmetatable = getfenv(0), setfenv, setmetatable
|
||||||
local loaded, defined, interfaces, environments = {}, {}, {}, {}
|
local loaded, defined = {}, {}
|
||||||
|
|
||||||
local function nop() end
|
local function nop() end
|
||||||
|
|
||||||
local function include(private, name)
|
|
||||||
local P = loaded[name] or error('No such module.', 2)
|
|
||||||
for k, v in P.public do private[k] = v end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function create_module(name)
|
local function create_module(name)
|
||||||
local P, private, public, modifier
|
local private, public = setmetatable({}, {__index=_G}), {}
|
||||||
local modifier = setmetatable({}, {
|
local modifier = setmetatable({}, {
|
||||||
__metatable=false,
|
__metatable=false,
|
||||||
__newindex=function(_, k, v)
|
__newindex=function(_, k, v) private[k], public[k] = v, v end
|
||||||
public[k] = v
|
|
||||||
if rawget(private, k) == nil then
|
|
||||||
private[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
})
|
})
|
||||||
local env = setmetatable(
|
private._G, private.nop, private._M, private.M = _G, nop, private, modifier
|
||||||
{_G=_G, _M=private, M=modifier, include=function(name) include(private, name) end, nop=nop},
|
private.include = function(name)
|
||||||
{__index=_G}
|
local P = loaded[name] or error('No such module.', 2)
|
||||||
)
|
for k, v in P.public do private[k] = v end
|
||||||
local public = {}
|
end
|
||||||
local interface = setmetatable({}, {__metatable=false, __index=public})
|
local interface = setmetatable({}, {__metatable=false, __index=public, __newindex=nop})
|
||||||
P = {private=private, public=public}
|
local P = {private=private, public=public, interface=interface}
|
||||||
environments[name], interfaces[name] = env, interface
|
|
||||||
loaded[name] = P
|
loaded[name] = P
|
||||||
|
return P
|
||||||
end
|
end
|
||||||
|
|
||||||
function module(name) if not loaded[name] then create_module(name) end defined[name] = true; setfenv(2, environments[name]) end
|
function module(name) local P = loaded[name] or create_module(name); defined[name] = true; setfenv(2, P.private) end
|
||||||
function require(name) if not loaded[name] then create_module(name) end return interfaces[name] end
|
function require(name) local P = loaded[name] or create_module(name); return P.interface end
|
||||||
function _G.defined(name) return defined[name] end
|
function _G.defined(name) return defined[name] end
|
||||||
Reference in New Issue
Block a user