-- Запоминаем стандартную метатаблицу кнопки
local mt = { __index = CreateFrame("Button") }

-- Экранируем локальные переменные блока
do
	-- Объявляем функцию SetSpell
	mt.__index["SetSpell"] = function(self,spellName)
		-- В бою смена заклинания запрещена
		if(UnitAffectingCombat("player")) then return nil; end;
		-- Определяем тип SecureActionButton при первом обращении
		if(not self:HasSpell()) then self:SetAttribute("type","spell"); end;
		-- Присваиваем имя заклинания
		self:SetAttribute("spell",spellName);
	end
	-- Объявляем функцию HasSpell
	mt.__index["HasSpell"] = function(self,spellName)
		local result = nil;
		-- Проверяем есть ли заклинание
		if(self:GetAttribute("spell")) then result = true; end;
		return result;
	end
	-- Объявляем функцию GetSpell
	mt.__index["GetSpell"] = function(self)
		local result = nil;
		-- Нам нечего возвращать, если заклинания нет
		if(self:HasSpell()) then 
			-- Получаем название заклинания
			local spellID = self:GetAttribute("spell");
			-- получаем общую информацию о заклинание
			local lname, lrank, licon, lcost, lisFunnel, lpowerType, lcastTime, lminRange, lmaxRange = GetSpellInfo(spellID);
			-- получаем информацию о кулдаунах
			local lstart, lduration, lenabled = GetSpellCooldown(spellID);
			-- Формируем ответ
			result = { 
				name = lname,
				rank = lrank, 
				icon = licon, 
				cost = lcost, 
				isFunnel = lisFunnel, 
				powerType = lpowerType, 
				castTime = lcastTime, 
				minRange = lminRange, 
				maxRange = lmaxRange,
				
				cdstart = lstart, 
				cdduration = lduration, 
				cdenabled = lenabled
				};
		end;
		return result;
	end
	-- Объявляем функцию SetSize
	mt.__index["SetSize"] = function(self,value)
		-- Просто присваиваем одинаковую высоту и ширину кнопки
		self:SetHeight(value);
		self:SetWidth(value);
	end
	-- Объявляем функцию UpdateButton, где происходят все преобразования елементов кнопки.
	mt.__index["UpdateButton"] = function(self)
		-- Первое вхождение, создаем текстуру иконки и размещаем её
		if(not self.__icon) then
			self.__icon = self:CreateTexture(nil, "BACKGROUND");
			self.__icon:SetPoint("TOPLEFT",self,"TOPLEFT",1,-1);
			self.__icon:SetPoint("BOTTOMRIGHT",self,"BOTTOMRIGHT",-1,1);
		end
		-- Первое вхождение, создаем текстуру подсветки
		if(not self.__highlight) then
			self.__highlight = self:CreateTexture(nil, "HIGHLIGHT");
			self.__highlight:SetAllPoints(self);
			-- Будем использовать стандартную рамку
			self.__highlight:SetTexture("Interface\\Buttons\\buttonhilight-squarequickslot");
			-- Выровняем по центру текстуру
			self.__highlight:SetTexCoord(0.08,0.96,0.03,0.91);
			-- И зададим тип смешивания
			self.__highlight:SetBlendMode("ADD");		
		end
		-- Первое вхождение, создаем текстуру нажатия
		if(not self.__pushed) then
			self.__pushed = self:CreateTexture(nil, "OVERLAY");
			self.__pushed:SetAllPoints(self);
			-- Просто затемним немного иконку заклинания
			self.__pushed:SetTexture(0,0,0,0.2);
		end
		-- Первое вхождение, создаем фрейм кулдауна
		if(not self.__cd) then
			self.__cd = CreateFrame("Cooldown", nil, self);
			self.__cd:SetAllPoints(self);
		end
		
		-- Прячем все елементы
		self.__highlight:Hide();
		self.__pushed:Hide();
		self.__icon:Hide();
		
		-- Если заклинание присвоено
		if(self:HasSpell()) then
			-- Получаем подробную информацию о заклинании
			local spellInfo = self:GetSpell();
			-- Присвоим текстуру иконки
			self.__icon:SetTexture(spellInfo["icon"]);
			-- Обрежем рамку стандартных иконок, у метелицы они все стилизированные
			self.__icon:SetTexCoord(0.06,0.94,0.08,0.94);
			
			-- Присвоим фрейму кулдауна текущий кулдаун заклинания
			self.__cd:SetCooldown(spellInfo["cdstart"],spellInfo["cdduration"]);
			
			-- Так как заклинание есть, покажем основные елементы
			self.__highlight:Show();
			self.__icon:Show();
			if(self:GetButtonState() == "PUSHED") then self.__pushed:Show(); end;
		end
	end
end
-- Функция создания нашей кнопоки
local function CreateActionButton(name,parent)
	-- Создаем кнопку на основе SecureActionButtonTemplate шаблона
	local f = CreateFrame("Button",name,parent or UIParent,"SecureActionButtonTemplate");
	-- Создадим фон и рамку кнопки
	local backdrop = {
			bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
			edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
			tile = true, 
			tileSize = 5, 
			edgeSize = 7,
			insets = { left = 1, right = 1, top = 1, bottom = 1 }
		}
		f:SetBackdrop(backdrop)
		f:SetBackdropBorderColor(0, 0, 0, 1)
		f:SetBackdropColor(0, 0, 0, 0.1)
	-- Определим наши функции
	setmetatable(f,mt);

	-- Реагируем на динамическую смену заклинаний
	f:SetScript("OnAttributeChanged", function(self,name,value)
		if(name == "spell") then self:UpdateButton(); end;
	end);
	
	-- Реагируем на нажатие
	f:SetScript("OnMouseDown", function(self,...)
		-- Так как состояние кнопки меняется после этого события, ускорим этот шаг и обновим кнопку
		self:SetButtonState("PUSHED");
		self:UpdateButton();
	end);
	-- Реагируем на клик. OnClick событие определено в шаблоне, потому его трогать не имеем права.
	f:SetScript("PostClick", function(self,...)
		-- По аналогии с реакцией на нажатие
		self:SetButtonState("NORMAL");
		self:UpdateButton();
	end);
	-- Мы должны корректно отрабатывать команду нажатия на кнопку
	f:SetScript("OnLeave",  function(self,...)
		-- По аналогии с реакцией на нажатие
		self:SetButtonState("NORMAL");
		self:UpdateButton();
	end);
	-- Реакция на изменение кулдауна заклинаний
	f:SetScript("OnEvent", function(self,event, arg1)
		if(event == "SPELL_UPDATE_COOLDOWN") then
			f:UpdateButton();
		end;
	end);
	
	f:RegisterEvent("SPELL_UPDATE_COOLDOWN");
	-- Инициализируем кнопку
	f:UpdateButton();
	return f;
end

local secureFrame = CreateActionButton(nil,UIParent);
secureFrame:SetSize(32);
secureFrame:SetSpell("Скачок");
secureFrame:SetPoint("CENTER",200,100);

Правда трендец? ) Вот и я о томже )
А вообще советую зайти сюда: http://sites.google.com/site/pslibdevelop/ откуда собственно этот код и взят, и возможно вы подчерпнете чтото новое для себя по LUA.