You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1009 B
69 lines
1009 B
4 months ago
|
--
|
||
|
-- classic
|
||
|
--
|
||
|
-- Copyright (c) 2014, rxi
|
||
|
--
|
||
|
-- This module is free software; you can redistribute it and/or modify it under
|
||
|
-- the terms of the MIT license. See LICENSE for details.
|
||
|
--
|
||
|
|
||
|
|
||
|
local Object = {}
|
||
|
Object.__index = Object
|
||
|
|
||
|
|
||
|
function Object:new()
|
||
|
end
|
||
|
|
||
|
|
||
|
function Object:extend()
|
||
|
local cls = {}
|
||
|
for k, v in pairs(self) do
|
||
|
if k:find("__") == 1 then
|
||
|
cls[k] = v
|
||
|
end
|
||
|
end
|
||
|
cls.__index = cls
|
||
|
cls.super = self
|
||
|
setmetatable(cls, self)
|
||
|
return cls
|
||
|
end
|
||
|
|
||
|
|
||
|
function Object:implement(...)
|
||
|
for _, cls in pairs({...}) do
|
||
|
for k, v in pairs(cls) do
|
||
|
if self[k] == nil and type(v) == "function" then
|
||
|
self[k] = v
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
function Object:is(T)
|
||
|
local mt = getmetatable(self)
|
||
|
while mt do
|
||
|
if mt == T then
|
||
|
return true
|
||
|
end
|
||
|
mt = getmetatable(mt)
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
|
||
|
function Object:__tostring()
|
||
|
return "Object"
|
||
|
end
|
||
|
|
||
|
|
||
|
function Object:__call(...)
|
||
|
local obj = setmetatable({}, self)
|
||
|
obj:new(...)
|
||
|
return obj
|
||
|
end
|
||
|
|
||
|
|
||
|
return Object
|