class.lua 1.7 KB

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