inputor

Evdev remapping utility in lua
git clone https://git.neptards.moe/u3shit/inputor.git
Log | Files | Refs

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