Puedes usar algo similar a Eval de instancia con delegación patrón, utilizado, por ejemplo, en Savon joya:
def batman(task, &block)
@original_self = eval('self', block.binding)
puts "Batman: #{task} - done"
instance_exec('feed cat', &block)
@news << task
end
private
def method_missing(method, *args, &block)
if @original_self
@original_self.send(method, *args, &block)
else
super
end
end
En este enfoque, cuando llame al método (con receptor implícito) que el bloque interior pasó a batman
método, se llama en el contexto de SuperHeros
instancia. Si no hay tal método disponible, la llamada va (a través de method_missing
) al bloque original self
.