Puoi usare qualcosa di simile a Istanza valuta con la delegazione pattern, usato - ad esempio - in Savon GEM:
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
In questo approccio, quando si chiama il metodo (con ricevitore implicito) all'interno del blocco passato batman
metodo, è chiamato nel contesto di SuperHeros
esempio. Se non esiste un metodo del genere, la chiamata passa (attraverso method_missing
) al blocco originale self
.