Voodoo é pra jacu!
         metaprogramação em ruby



   Leonardo Bessa            David Paniz
leobessa@gmail.com      davidpaniz@gmail.com
     @leobessa               @davidpaniz
                         www.davidpaniz.com
O que é metaprogramação?
 Metaprogramação é a programação de programas
que escrevem ou manipulam outros programas (ou a
        si próprios) assim como seus dados
O que é metaprogramação?

 Metaprogramming is writing code
        that writes code


 Metaprogramming is writing code
   that manipulates language
      constructs at runtime
Qual a tarifa agora?
class Calculator
  def calculate(time)
    if (7...21).include?(time.hour)
      1
    else
      0.5
    end
  end
end

p Time.now.tarifa

                               5
class Time
  def tarifa
    if (7...21).include?(hour)
      1
    else
      0.5
    end
  end
end

p Time.now.tarifa

                                 6
"I invented the term Object-
Oriented, and I can tell you I
did not have C++ in mind." -
          Alan Kay
class
class
Codando...
woody.class == amigo.class
Criação de métodos


• Eu realmente posso adicionar um
  método a um único objeto?

• Onde o método está?

• Que tipo de objeto pode definir um
  método?
Singleton Class


• Também conhecidas como Metaclass,
  Eigenclass, etc

• É uma classe como outra qualquer,
  mas escondida

• Existe uma para cada objeto (lazy)
Qual é a
Singleton Class

    class << self
       self
    end
Qual é a
Singleton Class

   class Object
    def singleton_class
      class << self
         self
      end
    end
   end
Codando...
Como logar a chamada
   de um método?
alias :new_name :old_name
Que tal só ‘log :voar’?
Abrindo a classe...
E se eu quiser logar
 mais de método?
Generalização

Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby