71 lines
1.8 KiB
Lua
71 lines
1.8 KiB
Lua
-----------------------------------------------------
|
|
---- SETCLASS CLONES THE BASIC OBJECT CLASS TO CREATE NEW CLASSES
|
|
-----------------------------------------------------
|
|
-- Supports INHERITANCE
|
|
---------------------------------------------------------------
|
|
-- EVERYTHING INHERITS FROM THIS BASIC OBJECT CLASS
|
|
|
|
BaseObject = {
|
|
super = nil,
|
|
name = "Object",
|
|
new =
|
|
function(class)
|
|
local obj = {class = class}
|
|
local meta = {
|
|
__index = function(self,key) return class.methods[key] end
|
|
}
|
|
setmetatable(obj,meta)
|
|
return obj
|
|
end,
|
|
methods = {classname = function(self) return(self.class.name) end},
|
|
data = {}
|
|
}
|
|
|
|
function setclass(name, super)
|
|
if (super == nil) then
|
|
super = BaseObject
|
|
end
|
|
|
|
local class = {
|
|
super = super;
|
|
name = name;
|
|
new =
|
|
function(self, ...)
|
|
local arg = {...}
|
|
local obj = super.new(self, "___CREATE_ONLY___");
|
|
-- check if calling function init
|
|
-- pass arguments into init function
|
|
if (super.methods.init) then
|
|
obj.init_super = super.methods.init
|
|
end
|
|
|
|
if (self.methods.init) then
|
|
if (tostring(arg[1]) ~= "___CREATE_ONLY___") then
|
|
obj.init = self.methods.init
|
|
if obj.init then
|
|
obj:init(unpack(arg))
|
|
end
|
|
end
|
|
end
|
|
|
|
return obj
|
|
end,
|
|
methods = {}
|
|
}
|
|
|
|
-- if class slot unavailable, check super class
|
|
-- if applied to argument, pass it to the class method new
|
|
setmetatable(class, {
|
|
__index = function(self,key) return self.super[key] end,
|
|
__call = function(self,...)
|
|
local arg = {...}
|
|
return self.new(self,unpack(arg))
|
|
end
|
|
})
|
|
|
|
-- if instance method unavailable, check method slot in super class
|
|
setmetatable(class.methods, {
|
|
__index = function(self,key) return class.super.methods[key] end
|
|
})
|
|
return class
|
|
end |