--Security table and Table both have the same keys
--however, the security table's values are numbers representing
--the current security level of execution. and Table's values
--are the actual methods/properties of the class.\
--Parent is the parent, pass nil if no parent.
function newObj(table, securityTable, parent)
local rTable = {}
local mTable = {}
local sTable = securityTable
local real = table
for k,v in pairs(real) do
if v == real then
real[k] = nil
end
end
real.Parent = parent
function mTable.__index(t,k)
if t == nil or k == nil then
return nil
end
for key,val in pairs(sTable) do
if key == k then
if val > code_level() then
return nil
else
return real[k]
end
end
end
if real.Parent ~= nil then
return real.Parent[k]
end
end
function mTable.__newindex(t,k,v)
if t == nil or k == nil or v == nil then
return
end
for key,val in pairs(sTable) do
if key == k then
if val > code_level() then
error("Improper set attempt on protected object")
else
real[k] = v
return
end
end
end
if real.Parent == nil then return; end;
if real.Parent[k] ~= nil then
real[k] = v
sTable[k] = real.Parent:GetSecurityRequire(k);
end
end
function rTable:IsA(table)
if real.Parent == table:SuperClass() then
return true
else
if real.Parent == nil then return false; end
return real.Parent:IsA(table)
end
return false;
end
function rTable:GetSecurityRequire(key)
if sTable[key] == nil then
if real.Parent ~= nil then
return real.Parent:GetSecurityRequire(key)
end
else
return sTable[key]
end
end
function rTable:SuperClass()
return real.Parent
end
function rTable:create()
local newReal = {}
local newSecure = {}
for k,v in pairs(real) do
newReal[k] = v
end
for k,v in pairs(sTable) do
newSecure[k] = v
end
return newObj(newReal, newSecure, real.Parent)
end
local function InnerIter(target, spot)
if code_level() < 5 then
return nil, nil, false
end
local key, val = next(target, spot)
if key == "Parent" then
return key, val, true
end
return key, val, false
end
function rTable:Pairs()
if code_level() < 5 then
local fail = function() return nil, nil; end
return fail, nil
end
local loopTarget = real
local iterTarget = InnerIter
local function iter(target, spot)
local key, val, changeTarget
key, val,changeTarget = iterTarget(loopTarget,spot)
if changeTarget == true then
iterTarget, loopTarget = loopTarget.Parent:Pairs()
return key,val
end
return key,val
end
return iter, looptarg, nil
end
setmetatable(rTable, mTable)
return rTable
end