From 9989ceb42fde80193f9fc27268979f03c4e7bc69 Mon Sep 17 00:00:00 2001 From: shirsig Date: Sun, 29 Oct 2017 08:32:33 +0100 Subject: [PATCH] Update module.lua --- libs/module.lua | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/libs/module.lua b/libs/module.lua index 943b571..977bcb6 100644 --- a/libs/module.lua +++ b/libs/module.lua @@ -1,36 +1,26 @@ if module then return end -local _G, setfenv, setmetatable, rawget = getfenv(0), setfenv, setmetatable, rawget -local loaded, defined, interfaces, environments = {}, {}, {}, {} +local _G, setfenv, setmetatable = getfenv(0), setfenv, setmetatable +local loaded, defined = {}, {} 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 P, private, public, modifier + local private, public = setmetatable({}, {__index=_G}), {} local modifier = setmetatable({}, { __metatable=false, - __newindex=function(_, k, v) - public[k] = v - if rawget(private, k) == nil then - private[k] = v - end - end + __newindex=function(_, k, v) private[k], public[k] = v, v end }) - local env = setmetatable( - {_G=_G, _M=private, M=modifier, include=function(name) include(private, name) end, nop=nop}, - {__index=_G} - ) - local public = {} - local interface = setmetatable({}, {__metatable=false, __index=public}) - P = {private=private, public=public} - environments[name], interfaces[name] = env, interface + private._G, private.nop, private._M, private.M = _G, nop, private, modifier + private.include = function(name) + local P = loaded[name] or error('No such module.', 2) + for k, v in P.public do private[k] = v end + end + local interface = setmetatable({}, {__metatable=false, __index=public, __newindex=nop}) + local P = {private=private, public=public, interface=interface} loaded[name] = P + return P end -function module(name) if not loaded[name] then create_module(name) end defined[name] = true; setfenv(2, environments[name]) end -function require(name) if not loaded[name] then create_module(name) end return interfaces[name] end -function _G.defined(name) return defined[name] end \ No newline at end of file +function module(name) local P = loaded[name] or create_module(name); defined[name] = true; setfenv(2, P.private) end +function require(name) local P = loaded[name] or create_module(name); return P.interface end +function _G.defined(name) return defined[name] end