Plugin quad bind class local module = {}; function module.init(shared) local new = {}; local bind = shared.event.bind; local addObject = shared.store.addObject; function new.make(ClassName,prop) -- make thing local item; local classOfClassName = type(ClassName); if classOfClassName == "string" then -- if classname is a string value, cdall instance.new for making new roblox instance item = Instance.new(ClassName); elseif classOfClassName == "function" then -- if classname is a function value, call it for making new object (OOP object) item = ClassName(); elseif classOfClassName == "table" then -- if classname is a calss what is included new function, call it for making new object (object) local func = ClassName.new or ClassName.New or ClassName.__new; item = func(); end if not item then -- if cannot make new object, ignore this call local str = tostring(ClassName); print(("fail to make item '%s', did you forget to checking the class '%s' is exist?"):format(str,str)); end -- set property and adding child and binding functions for index,value in pairs(prop) do local valueType = typeof(value); local indexType = typeof(index); -- child if indexType ~= "string" then -- object value.Parent = new; elseif valueType == "function" and bind(value) then -- connect event elseif indexType == "string" then new[index] = value; -- set property end end return item; end local make = new.make; function new.import(ClassName) -- make new quad class object local this = {styles = {}}; setmetatable(this,{ __call = function (self,prop) if type(prop) == "string" then local lastName = prop; return function (nprop) nprop.Name = lastName; local item = make(ClassName,nprop); addObject(lastName,item); return item; end; end return make(ClassName,prop); end; }); return this; end -- set module calling function setmetatable(new,{ __call = function (self,...) return self.import(...); end; }); return new; end return module; event local module = {}; function module.init(shared) local new = {}; local unpack = table.unpack; local coroutineCreate = coroutine.create; local coroutineResume = coroutine.resume; local prefix = "event::"; local special = { ["Property::(.+)"] = function (this,func,property) this.GetPropertyChangedSignal(property):Connect(function() func(this,this[property]); end); end; ["CreatedSync::"] = function (this,func) func(this); end; ["Created::"] = function (this,func) coroutineResume(coroutineCreate(func),this); end; }; local prefixLen = #prefix; setmetatable(new,{ __call = function(self,eventName) return prefix .. eventName; end; }); -- try binding, if key dose match with anything, ignore call function new.bind(this,key,func) -- check prefix if key:sub(1,prefixLen) ~= prefix then return; end key = key:sub(prefixLen + 1,-1); -- find special bindings for specKey,specFunc in pairs(special) do local find = {key:match(specKey)}; if #find ~= 0 then specFunc(this,func,unpack(find)); return true; end end -- binding normal events local event = this[key]; if event then event:Connect(function(...) func(this,...); end); return true; end end -- property changed binding local prefixProperty = prefix .. "Property::"; function new.property(name) return prefixProperty .. name; end -- when created binding new.created = prefix .. "Created::"; new.createdSync = prefix .. "CreatedSync::"; return new; end return module; mount local module = {}; function module.init(shared) local new = {}; -- we should add plugin support function new.mount(to,this) this.Parent = to; end setmetatable(new,{ __call = function (self,...) self.mount(...); end; }); return new; end return module; require -- remove the roblox's require system, -- now, we can call modules with string path if (not workspace) and (not game) and (not script) then return; end return function (query) local typeQuery = type(query); if typeQuery == "string" then local object = script.Parent; query = query:gsub("/","."); -- local index = 0; query:gsub("[^%.]+",function (this) -- index = index + 1; -- if index == 1 and this == "src" then -- return; -- end local lastObject = object; object = object[this]; if not object then object = lastObject.libs error(("[require] : object %s was not found from this worktree, require failed"):format(query)); end end); return require(object); elseif typeQuery == "userdata" then return require(query); end end; store style local module = {}; function module.init(shared) local new = {}; function shared.new(property) end return new; end return module;