IncludeUrl

Untitled

Sep 25th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. local p="0.1.0"local l,n,s,c=assert,type,rawget,rawset
  2. local e,d=getmetatable,setmetatable
  3. local b=string.format
  4. local o=table.insert
  5. local a=table.remove
  6. local g=table.unpack
  7. local _={}local e
  8. function _.extend(s,a)if not s or not a then
  9. error("table can't be nil")end
  10. local function r(l,t)for e,s in pairs(l)do
  11. if n(l[e])=="table"and
  12. n(t[e])=="table"then
  13. t[e]=r(l[e],t[e])elseif n(l[e])=="table"then
  14. t[e]=r(l[e],{})else
  15. t[e]=s
  16. end
  17. end
  18. return t
  19. end
  20. return r(s,a)end
  21. local function f(r,t)t=t or e
  22. l(n(r)=='string',"ctor name should be string")l(t.is_class,"Class is not is_class")t[r]=t.__ctor__
  23. return t[r]end
  24. local function u(r,t)t=t or e
  25. l(n(r)=='string',"dtor name should be string")l(t.is_class,"Class is not is_class")t[r]=t.__dtor__
  26. return t[r]end
  27. local function h(t,...)local r={...}local e=r[1]l(n(e)=='table'or n(e)=='string',"superCall arg not table or string")local i,l,_
  28. if n(e)=='table'then
  29. i=a(r,1)l=a(r,1)else
  30. l=a(r,1)end
  31. _=r
  32. local e=t.__dmc_super
  33. local d=(e~=nil)local c=nil
  34. local function _(e,l,t)if not e then return end
  35. local n=nil
  36. for r,e in ipairs(e)do
  37. if not t or e==t then
  38. if s(e,l)then
  39. n=e
  40. break
  41. else
  42. n=_(e.__parents,l)if n then break end
  43. end
  44. end
  45. end
  46. return n
  47. end
  48. local s,n
  49. if e==nil then
  50. t.__dmc_super={}e=t.__dmc_super
  51. n=_({t.__class},l)o(e,n)end
  52. s=e[#e]n=_(s.__parents,l,i)if n then
  53. o(e,n)c=n[l](t,g(r))a(e,#e)end
  54. if d==false then
  55. i=nil
  56. a(e,#e)t.__dmc_super=nil
  57. end
  58. return c
  59. end
  60. local function i(n,e)e=e or{}l(e.set_isClass~=nil,"initializeObject requires paramter 'set_isClass'")local t=e.set_isClass
  61. local t=e.data or{}n.__is_class=e.set_isClass
  62. local e=e.parent
  63. if e then
  64. c(n,'__parent_lock',e)if e.__new__ then
  65. e.__new__(n,table.unpack(t))end
  66. c(n,'__parent_lock',nil)end
  67. return n
  68. end
  69. local function g(e,r,t)local l,n
  70. l=s(e,'__setters')or{}n=l[r]if n then
  71. n(e,t)else
  72. c(e,r,t)end
  73. end
  74. local function r(l,t)local n,e
  75. n=s(l,'__getters')or{}if n[t]then return n[t](l)end
  76. e=s(l,t)if e~=nil then return e end
  77. n=s(l,'__parent_lock')if n then
  78. if n then e=n[t]end
  79. if e~=nil then return e end
  80. else
  81. local n=s(l,'__parents')for l,n in ipairs(n)do
  82. if n[t]~=nil then
  83. e=n[t]break
  84. end
  85. end
  86. if e~=nil then return e end
  87. end
  88. return nil
  89. end
  90. local function a(n,e)e=e or{}e.object=e.object or{}e.set_isClass=e.set_isClass==true and true or false
  91. local e=e.object
  92. local t=tostring(e)local t={__index=r,__newindex=g,__tostring=function(e)return e:__tostring__(t)end,__call=function(e,...)return e:__ctor__(...)end}d(e,t)e.__parents=n
  93. e.__is_dmc=true
  94. e.__setters={}e.__getters={}for t=#n,1,-1 do
  95. local n=n[t]if n.__getters then
  96. e.__getters=_.extend(n.__getters,e.__getters)end
  97. if n.__setters then
  98. e.__setters=_.extend(n.__setters,e.__setters)end
  99. end
  100. return e
  101. end
  102. local function s(t,r)t=t or{}r=r or{}r.set_isClass=true
  103. r.name=r.name or"<unnamed class>"l(n(t)=='table',"first parameter should be nil, a Class, or a list of Classes")if t.is_class==true then
  104. t={t}elseif e and#t==0 then
  105. o(t,e)end
  106. local e=a(t,{})i(e,r)e.__class=e
  107. e.__name=r.name
  108. return e
  109. end
  110. local function _(n,t,l)n=n==nil and n or{n}return s(n,t)end
  111. e=s(nil,{name="Class Class"})function e:__ctor__(...)local n={data={...},set_isClass=false,parent=self.__class}local e=a({self.__class},n)i(e,n)return e
  112. end
  113. function e:__dtor__()self:__destroy__()end
  114. function e:__new__(...)return self
  115. end
  116. function e:__tostring__(e)return b("%s (%s)",self.NAME,e)end
  117. function e:__destroy__()end
  118. function e.__getters:NAME()return self.__name
  119. end
  120. function e.__getters:class()return self.__class
  121. end
  122. function e.__getters:supers()return self.__parents
  123. end
  124. function e.__getters:is_class()return self.__is_class
  125. end
  126. function e.__getters:is_intermediate()return self.__is_class
  127. end
  128. function e.__getters:is_instance()return not self.__is_class
  129. end
  130. function e.__getters:version()return self.__version
  131. end
  132. function e:isa(t)local e=false
  133. local n=self.class
  134. if n==t then
  135. e=true
  136. else
  137. local n=self.__parents
  138. for l=1,#n do
  139. local n=n[l]if n.isa then
  140. e=n:isa(t)end
  141. if e==true then break end
  142. end
  143. end
  144. return e
  145. end
  146. function e:optimize()local function l(t,e)if not e or#e==0 then return end
  147. for r=#e,1,-1 do
  148. local e=e[r]l(t,e.__parents)for l,e in pairs(e)do
  149. if n(e)=='function'then
  150. t[l]=e
  151. end
  152. end
  153. end
  154. end
  155. l(self,{self.__class})end
  156. function e:deoptimize()for e,t in pairs(self)do
  157. if n(t)=='function'then
  158. self[e]=nil
  159. end
  160. end
  161. end
  162. f('new',e)u('destroy',e)e.superCall=h
  163. return d({__version=p,__superCall=h,setNewClassGlobal=makeNewClassGlobal,registerCtorName=f,registerDtorName=u,inheritsFrom=_,newClass=s,Class=e},{__call=function(e,...)return s(...)end})
Advertisement
Add Comment
Please, Sign In to add comment