Advertisement
Guest User

require modules which polutes globals

a guest
Apr 5th, 2021
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.12 KB | None | 0 0
  1. local function require_external(modname)
  2.     if type(modname) ~= 'string' then
  3.         error("bad argument #1 to 'require_external' (string expected, got "..type(modname)..")", 2)
  4.     end
  5.     if package.loaded[modname] ~= nil then
  6.         if package.loaded[modname] == false then
  7.             error("loop or previous error loading module '".. modname .. "'", 2)
  8.         end
  9.         return package.loaded[modname]
  10.     end
  11.  
  12.     package.loaded[modname] = false
  13.  
  14.     -- search file on FS (Tarantool only)
  15.     local file = assert(package.search(modname), "module "..modname.." not found")
  16.  
  17.     -- Create separate Global
  18.     local mod = setmetatable({}, { __index = _G })
  19.  
  20.     -- Run loader (syntax linting)
  21.     local loader = assert(loadfile(file))
  22.  
  23.     -- Change global environment (to exclude polution of app's global)
  24.     setfenv(loader, mod)
  25.  
  26.     -- Load module
  27.     local result = loader(modname)
  28.  
  29.     -- Drop metatable of module for good
  30.     setmetatable(mod, nil)
  31.  
  32.     -- Check if module returns something
  33.     if result ~= true then
  34.         result = result or mod
  35.     else
  36.         -- If module returns nothing (true by default) return mod
  37.         result = mod
  38.     end
  39.  
  40.     package.loaded[mod] = result
  41.  
  42.     return result
  43. end
  44.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement