Metatable
The metatable functions allow elevated access to locked metatables.
getrawmetatable
function getrawmetatable(object: table): tableReturns the metatable of object, where the __metatable field would normally lock the metatable.
Parameters
object- An object with a metatable.
Example
local object = setmetatable({}, { __metatable = "Locked!" })
print(getmetatable(object)) --> Locked!
print(getrawmetatable(object)) --> tablehookmetamethod
function hookmetamethod(object: table, method: string, hook: function): functionReplaces func with hook internally, where hook will be invoked in place of func when called.
Returns a new function that can be used to access the original definition of func.
⚠️ Not yieldableThe function
hookis not allowed to yield or block the thread.
⚠️ RecursionTry not to invoke
methodfrom within the functionhook! For example, do not index a property of an Instance from within a hook to__index.
Parameters
object- An object with a metatable.method- The name of the method to hook.hook- The function to replacefuncwith.
Example
Prevent scripts in PlayerGui from invoking the __namecall hook:
local refs = {}
local bannedScripts = game:GetService("Players").LocalPlayer.PlayerGui
refs.__namecall = hookmetamethod(game, "__namecall", function(...)
local caller = getcallingscript()
-- Use '.' notation to call the IsDescendantOf method without invoking
-- __namecall and causing a recursive loop.
local isBanned = caller.IsDescendantOf(caller, bannedScripts)
if isBanned then
error("Not allowed to invoke __namecall")
end
return refs.__namecall(...)
end)getnamecallmethod
function getnamecallmethod(): stringReturns the name of the method that invoked the __namecall metamethod.
Example
Bans the use of game:service():
local refs = {}
refs.__namecall = hookmetamethod(game, "__namecall", function(...)
local self = ...
local method = getnamecallmethod()
if self == game and method == "service" then
error("Not allowed to run game:service()")
end
return refs.__namecall(...)
end)isreadonly
function isreadonly(object: table): booleanReturns whether object is frozen or read-only. Identical to table.isfrozen.
Parameters
object- A table or userdata.
Example
local object = {}
table.freeze(object)
print(isreadonly(object)) --> truesetrawmetatable
function setrawmetatable(object: table, metatable: table): ()Sets the metatable of object to metatable, where the __metatable field would normally lock the metatable.
Parameters
object- A table or userdata.metatable- The metatable to set.
Example
local object = setmetatable({}, {})
print(getmetatable(object)) --> table
setrawmetatable(object, { __metatable = "Hello, world!" })
print(getmetatable(object)) --> Hello, world!setreadonly
function setreadonly(object: table, readonly: boolean): ()Sets whether object is frozen or read-only.
Parameters
object- A table or userdata.readonly- Whether or notobjectshould be frozen.
Example
local object = {}
table.freeze(object)
print(isreadonly(object)) --> true
setreadonly(object, false)
print(isreadonly(object)) --> falseLast updated