Files
aux-addon-ClassicAPI/libs/module.lua
T
Manuel Simon Hirsig 3dbeb1e679 refactoring
2017-11-07 22:01:30 +01:00

36 lines
974 B
Lua

if module then return end
local _G, setfenv, setmetatable = getfenv(0), setfenv, setmetatable
local environments, exports_data, interfaces = {}, {}, {}
local function nop() end
local function create_module(name)
local environment, exports = setmetatable({_G=_G, nop=nop}, {__index=_G}), {}
environment.M = setmetatable({}, {
__metatable=false,
__newindex=function(_, k, v)
environment[k], exports[k] = v, v
end,
})
environment.include = function(name)
for k, v in exports_data[name] or error('No such module.', 2) do
environment[k] = v
end
end
environment._M = environment
interfaces[name] = setmetatable({}, {__metatable=false, __index=exports, __newindex=nop})
environments[name], exports_data[name] = environment, exports
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