big refactoring

This commit is contained in:
Manuel Simon Hirsig
2016-08-21 14:39:18 +02:00
parent 97bab31dbd
commit a054bb8cff
+13 -11
View File
@@ -22,7 +22,9 @@ function declarator_mt.__index(self, key)
if modifier then if modifier then
state.modifiers = modifier + mask(MODIFIER_MASK[key], state.modifiers) state.modifiers = modifier + mask(MODIFIER_MASK[key], state.modifiers)
return self return self
elseif not state.metadata[key] or error('Field "%s" already exists.', 2, key) then elseif state.metadata[key] then
error('Field "%s" already exists.', 2, key)
else
state.modifiers = PROPERTY + mask(PROPERTY_MASK, state.modifiers) state.modifiers = PROPERTY + mask(PROPERTY_MASK, state.modifiers)
return function(t) define_property(self, key, t) end return function(t) define_property(self, key, t) end
end end
@@ -35,33 +37,33 @@ end
do do
local function index(access, default) local function index(access, default)
return function(self, key) return function(self, key)
local state = _state[self]; local modifiers = state.metadata[key] local state = _state[self]; local modifiers = state.metadata[key] or error('No field "%s".', 2, key)
if mask(access+PROPERTY, modifiers) == access then if mask(access+PROPERTY, modifiers) == access then
return state.data[key] return state.data[key]
else else
local getter = state.getters[key] local getter = state.getters[key]
if getter then return getter() else return default[key] or error('No field "%s".', 2, key) end if getter then return getter() else return default[key] end
end end
end end
end end
env_mt = {__metatable=false, __index=index(PRIVATE, _g)} env_mt = {__metatable=false, __index=index(PRIVATE, _g)}
function env_mt.__newindex(self, key, value) function env_mt.__newindex(self, key, value)
local state = _state[self] local state = _state[self]; local modifiers = state.metadata[key]
if not state.metadata[key] then if modifiers then
state.metadata[key] = PRIVATE
else
local setter = state.setters[key] local setter = state.setters[key]
if setter then return setter(value) end if setter then return setter(value) end
if mask(MUTABLE, state.metadata[key]) == 0 then error('Field "%s" is immutable.', 2, key) end if mask(MUTABLE, modifiers) == 0 then error('Field "%s" is immutable.', 2, key) end
else
state.metadata[key] = PRIVATE
end end
state.data[key] = value state.data[key] = value
end end
interface_mt = {__metatable=false, __index=index(PUBLIC, {})} interface_mt = {__metatable=false, __index=index(PUBLIC, {})}
function interface_mt.__newindex(self, key, value) function interface_mt.__newindex(self, key, value)
local state = _state[self]; local setter = state.setters[key] local state = _state[self]; local setter, metadata = state.setters[key], state.metadata or error('No field "%s".', 2, key)
if mask(PUBLIC+PROPERTY, state.metadata[key]) == PUBLIC+PROPERTY and setter then if mask(PUBLIC+PROPERTY, metadata) == PUBLIC+PROPERTY and setter then
return setter(value) return setter(value)
elseif mask(PUBLIC, state.metadata[key]) == PUBLIC or error('Field "%s" is immutable.', 2, key) then elseif mask(PUBLIC, metadata) == PUBLIC or error('Field "%s" is immutable.', 2, key) then
state.data[key] = value state.data[key] = value
end end
end end