class.lua 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. function __areclassesequal(a,b)
  2. return a.__ptr == b.__ptr
  3. end
  4. function class(name)
  5. local cls = {}
  6. cls.__classname = name
  7. cls.__tostring = function(c)
  8. return "Class of type "..c.__classname
  9. end
  10. cls.__newindex = function(t,k,v)
  11. retVal = false
  12. if t["__setvar"] ~= nil then
  13. retVal = t["__setvar"](t,k,v)
  14. end
  15. if retVal == false then
  16. rawset(t,k,v)
  17. end
  18. end
  19. cls.__eq = __areclassesequal
  20. cls.__index = function(t,k)
  21. local prototype = rawget(t,"__prototype")
  22. if prototype ~= nil then
  23. ret = rawget(prototype,k)
  24. if ret ~= nil then return ret end
  25. end
  26. if k ~= "__index" and k ~= "__getvar" then
  27. if t["__getvar"] ~= nil then
  28. local ret = t["__getvar"](t,k)
  29. if ret ~= nil then return ret end
  30. end
  31. return rawget(t,k)
  32. end
  33. end
  34. _G[name] = setmetatable(cls, {
  35. __call = function (c, ...)
  36. local instance = setmetatable({}, cls)
  37. instance.__prototype = cls
  38. if cls[name] then
  39. cls[name](instance, ...)
  40. end
  41. return instance
  42. end})
  43. return function(superclass)
  44. if type(superclass) == 'table' then
  45. cls[superclass.__classname] = {}
  46. setmetatable(cls[superclass.__classname], superclass)
  47. for i,v in pairs(superclass) do
  48. if cls[i] == nil then
  49. cls[i] = v
  50. else
  51. cls[superclass.__classname][i] = v
  52. end
  53. end
  54. cls.__baseclass = superclass
  55. end
  56. end
  57. end