Advertisement
GnoX

Class

Jul 14th, 2014
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.51 KB | None | 0 0
  1. local overloaded
  2.  
  3. function new(Class)
  4.     Class = {}
  5.     Class.__index = Class
  6.    
  7.     setmetatable(Class, {
  8.         __call = function (cls, ...)
  9.             return cls.new(...)
  10.         end,
  11.     })
  12.    
  13.     Class.new = overloaded()
  14.    
  15.     function Class.new.default()
  16.         local self = setmetatable({}, Class)
  17.         return self
  18.     end
  19.    
  20.     return Class
  21. end
  22.  
  23. function overloaded()
  24.     local fns = {}
  25.     local mt = {}
  26.    
  27.     local function oerror()
  28.         return error("Invalid argument types to overloaded function")
  29.     end
  30.    
  31.     function mt:__call(...)
  32.         local argv = {...}
  33.         local default = self.default
  34.        
  35.         local signature = {}
  36.             for i,arg in ipairs {...} do
  37.             signature[i] = type(arg)
  38.         end
  39.        
  40.         signature = table.concat(signature, ",")
  41.        
  42.         return (fns[signature] or self.default)(...)
  43.     end
  44.    
  45.     function mt:__index(key)
  46.         local signature = {}
  47.         local function __newindex(self, key, value)
  48.             signature[#signature+1] = key
  49.             fns[table.concat(signature, ",")] = value
  50.         end
  51.         local function __index(self, key)
  52.             signature[#signature+1] = key
  53.             return setmetatable({}, { __index = __index, __newindex = __newindex })
  54.         end
  55.         return __index(self, key)
  56.     end
  57.    
  58.     function mt:__newindex(key, value)
  59.         fns[key] = value
  60.     end
  61.    
  62.     return setmetatable({ default = oerror }, mt)
  63. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement