Buscando uma idéia para mudar o comportamento de uma classe em uma determinada situação, fiz alguns testes, incluindo o exemplo abaixo.
class Pie
def initialize(name, age)
@name = name
@age = age
end
def to_s
@name
end
def age
@age
end
end
#Age is saved in seconds
SECOND = 1
MINUTE = 60 * SECOND
HOUR = 60 * MINUTE
DAY = 24 * HOUR
WEEK = 7 * DAY
first_pie = Pie.new "Torta de Ameixa da Vovo", 6000
def using(unit, &block)
Pie.class_eval { alias_method :original_age, :age }
Pie.send :define_method, :age do
original_age / (Kernel.const_get unit.to_s.upcase)
end
yield
Pie.class_eval { alias_method :age, :original_age }
end
using :second do
puts "Seconds: #{first_pie.age}"
end
using :minute do
puts "Minutes: #{first_pie.age}"
end
using :hour do
puts "Hours: #{first_pie.age}"
end
Como é possível identificar, cada bloco altera o comportamento do método ‘age’.
A maneira não é segura, nem muito boa para ser usada em produção, pois se ocorrer algum erro, é provavel que o método original se perca, mas é uma ótima forma de saber como a linguagem possui alguns recursos bem interessantes.