Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- A small convenient library I wrote to make OOP easier. Consider it an extra gift ;)
- ]]
- local RunService = game:GetService("RunService")
- local Class = {
- classes = {} -- A dictionary of the names of all classes created with class() to the classes
- } -- Abstract Base Class for all classes, equivalent of Roblox's Instance
- Class.__index = Class
- function Class.get(className) -- A wrapper
- return Class.classes[className]
- end
- function Class:clientOnly(memberName, member)
- if RunService:IsClient() then
- self[memberName] = member
- end
- return member
- end
- function Class:serverOnly(memberName, member)
- if RunService:IsServer() then
- self[memberName] = member
- end
- return member
- end
- function Class:super(n) -- Takes in how many parents up, returns parent class
- n = n or 1
- local parent = self
- for _ = 1, n do
- parent = parent.__super__
- end
- return parent
- end
- function Class:GetSuperclasses()
- local supers = {}
- local classIterator = self.__super__
- if classIterator == nil then return end
- repeat
- table.insert(supers, classIterator)
- classIterator = classIterator.__super__
- until classIterator == nil
- return supers
- end
- function Class:IsA(class) -- Checks if the classes match; could be class name or object
- class = typeof(class) == "table" and class.__classname__ or class
- local classIterator = self.__class__
- repeat
- if classIterator.__classname__ == class then
- return true
- end
- classIterator = classIterator.__super__
- until classIterator == nil
- return false
- end
- function Class:init(...)
- local className = self.__classname__
- warn(className .. " does not have a " .. className .. ":init() function.")
- end
- setmetatable(Class, {
- __call = function(_, name, parent) -- Returns a newly created class, takes string name and parent class
- parent = typeof(parent) == 'string' and Class.get(parent) or parent
- local classInst = {}
- classInst.__index = classInst
- classInst.__classname__ = name -- Class metadata
- classInst.__class__ = classInst
- classInst.__super__ = parent
- classInst.__script__ = getfenv(2).script
- Class.classes[name] = classInst
- setmetatable(classInst, parent or Class)
- function classInst.new(...)
- local instance = setmetatable({}, classInst) -- No cyclic table ref in serialization
- classInst['init'](instance, ...)
- return instance
- end
- return classInst
- end
- })
- return Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement