MyAddOn_Design = { { type="Frame", name="$parent_Frame", parent="UIParent", inherits=nil, methods = { SetHeight = { 100 }, SetWidth = { 100 }, SetPoint = { "TOPRIGHT", -50, -50 }, } frames = { { type="Button", name="$parent_SomethingButton", parent="MyFrame", inherits="UIPanelButtonTemplate", methods = { SetPoint = { "TOPLEFT", 20,-20 }, SetWidth = { 100 }, SetHeight = { 20 }, } } } }, { type="Frame", name="$parent_Frame2", parent="MyFrame", inherits=nil, methods = { SetPoint = { } } }, } MyAddOn_UI = { Design = MyAddOn_Design, Cache = {} Worker = function(self, frames, root, parent, lastname) for _,f in ipairs(frames) do local p = f.parent and getglobal(f.parent) or nil; local n = f.name and gsub(f.name, "%$parent", lastname); o = CreateFrame(f.type, n, p, f.inherits); for m,v in pairs(f.methods) do o[m](o, unpack(v)); end if(f.frames) then Worker(self,f.frames,root,f,n); end end end Init = function(self) Worker(self, self.Design, self.Design, nil, "MyAddOn"); end } MyAddOn_UI:Init();