mt.lua (1081B)
1 local error, next, pairs = error, next, pairs 2 3 local module = {} 4 5 local function base_getter(self, k, v) 6 error("No getter for "..k, 2) 7 end 8 local function base_setter(self, k, v) 9 error("No setter for "..k, 2) 10 end 11 12 function module.add_index_methods(mt, index) 13 local getters, setters = {}, {} 14 for k,v in pairs(index) do 15 if k:sub(1,4) == "get_" then 16 getters[k:sub(5)] = v 17 elseif k:sub(1, 4) == "set_" then 18 setters[k:sub(5)] = v 19 end 20 end 21 22 if next(setters) then 23 local base = mt.base_setter or base_setter 24 mt.__newindex = function(self, k, v) 25 local s = setters[k] 26 if s then return s(self, v) end 27 return base(self, k, v) 28 end 29 else 30 mt.__newindex = mt.base_setter 31 end 32 33 if mt.base_getter or next(getters) then 34 local base = mt.base_getter or base_getter 35 mt.__index = function(self, k) 36 local x = index[k] 37 if x then return x end -- non-getter 38 x = getters[k] 39 if x then return x(self) end 40 return base(self, k) 41 end 42 else 43 mt.__index = index 44 end 45 return mt 46 end 47 48 return module