--[[property.lua local Object = class() prop = property(Object) prop:reader("id", 0) prop:accessor("name", "") --]] local ACCESSOR = 1 local WRITER = 2 local READER = 3 local function prop_accessor(_, class, name, default, mode, cb) class.__default[name] = {default} if mode <= WRITER then class["set_" .. name] = function(self, value) if self[name] == nil or self[name] ~= value then self[name] = value if cb then cb(self, name, value) end end end mode = mode + 2 end if mode <= READER then class["get_" .. name] = function(self) if self[name] == nil then return default end return self[name] end if type(default) == "boolean" then class["is_" .. name] = class["get_" .. name] end end end local property_reader = function(self, name, default) prop_accessor(self, self.__class, name, default, READER) end local property_writer = function(self, name, default, cb) prop_accessor(self, self.__class, name, default, WRITER, cb) end local property_accessor = function(self, name, default, cb) prop_accessor(self, self.__class, name, default, ACCESSOR, cb) end function Property(class) local prop = { __class = class, reader = property_reader, writer = property_writer, accessor = property_accessor, } return prop end