Вы можете использовать что -то похожее на Экземпляр Eval с делегированием шаблон, используемый - например, в Савон драгоценный камень:
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
При таком подходе, когда вы вызовут метод (с неявным приемником) внутри блока, переданный в batman
метод, он называется в контексте SuperHeros
пример. Если такого метода нет, вызов проходит (через method_missing
) в исходный блок self
.