Module:No globals
Appearance
Documentation for this module may be created at Module:No globals/doc
-- <pre>
--------------------------------------------------------------------------------
-- Source: https://dev.fandom.com/wiki/Module:No_globals
--- No globals prevents nil global variables from being written to or read.
-- This module greatly reduces the chance of errors from overriding globals.
--
-- To use the module, add the following code below your module table
-- definition:
--
-- {{#tag:pre|require('Module:No globals')}}

--
-- The @{require} function sets the `arg` global in the package library when
-- loading a module - see the [source code](https://git.io/JfKu8) in Scribunto
-- core. To ensure Scribunto can load modules, the `arg` global is whitelisted.
--
-- @script getmetatable(_G)
-- @alias mt
-- @release stable
-- @note This module has been adapted as a library in
-- [[mw:gerrit:q/834623|MediaWiki core]], called as
-- `require('strict')`.
-- @author [[wikipedia:User:Jackmcbarn|Jackmcbarn]] (Wikipedia)
-- @author [[User:Dessamator|Dessamator]]
-- @attribution [[wikipedia:Module:No globals|Wikipedia]]
local mt = getmetatable(_G) or {}
--- Read access restriction on @{_G} global table.
-- @function mt.__index
-- @param {table} t Global table - @{_G}.
-- @param k Indexed key.
-- @error[opt,28] {string} 'tried to read nil global $k'
function mt.__index(t, k)
if k ~= 'arg' then
error('Tried to read nil global ' .. tostring(k), 2)
end
return nil
end
--- Write access restriction on @{_G} global table.
-- @function mt.__newindex
-- @param {table} t Global table - @{_G}.
-- @param k Indexed key.
-- @param v Value to be assigned.
-- @error[opt,42] {string} 'tried to write global $k'
function mt.__newindex(t, k, v)
if k ~= 'arg' then
error('Tried to write global ' .. tostring(k), 2)
end
rawset(t, k, v)
end
setmetatable(_G, mt)