Plugin quad class local module = {}; function module.init(shared) local new = {}; local bind = shared.event.bind; local items = shared.items; function new.make(ClassName,prop) -- make thing local item; local classOfClassName = type(ClassName); if classOfClassName == "string" then item = Instance.new(ClassName); elseif classOfClassName == "function" then item = ClassName(); elseif classOfClassName == "table" then local func = ClassName.new or ClassName.New or ClassName.__new; item = func(); end if not item then 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) return function (prop) if type(prop) == "string" then local lastName = prop; return function (nprop) nprop.Name = lastName; local item = make(ClassName,nprop); items[lastName] = item; return item; end; end return make(ClassName,prop); end; end 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; store style local module = {}; function module.init(shared) local new = {}; function shared.new() end function shared. return new; end return module;