MyAddOn_Design = { { type="Frame", name="$parent_Frame", parent="UIParent", inherits=nil, methods = { SetHeight = { 100 }, SetWidth = { 100 }, SetPoint = { "TOPRIGHT", -50, -50 }, } children = { { type="Button", name="$parent_SomethingButton", inherits="UIPanelButtonTemplate", methods = { SetPoint = { "TOPLEFT", 20,-20 }, SetWidth = { 100 }, SetHeight = { 20 }, } }, { type="Texture", methods = { SetAllPoints = { "&parent" }, SetTexture = { 0.6,0.1,0.1,0.5 }, Show { true }, } }, }, }, { type="Frame", name="$parent_Frame2", parent="MyFrame", inherits=nil, methods = { SetPoint = { } } }, } MyAddOn_UI = { Design = MyAddOn_Design, Cache = {} ArgSubsts = { }, FixArgs = function(self, args) end Worker = function(self, collection, root, parent, lastname) self.ArgSubsts["&parent"] = parent; for _,obj in ipairs(frames) do local n = obj.name and gsub(obj.name, "%$parent", lastname); local p = obj.parent and getglobal(obj.parent) or parent; f = CreateFrame(obj.type, n, p, obj.inherits); for method,args in pairs(obj.methods) do f[method](f, self:FixArgs(args)); end if(obj.children) then Worker(self,obj.children,root,f,n); end end end Init = function(self) Worker(self, self.Design, self.Design, nil, "MyAddOn"); end } MyAddOn_UI:Init();