Você pode usar algo semelhante a Eval da instância com delegação padrão, usado - por exemplo - em Savon gema:
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
Nesta abordagem, quando você chama o método (com receptor implícito) interno do bloco passado para batman
método, é chamado no contexto de SuperHeros
instância. Se não houver esse método disponível, a chamada vai (através method_missing
) para o bloco original self
.