Rubyで(ブロック付きのメソッドを)関数合成をするには?

def foo; puts 'foo'; yield; end
def bar; puts 'bar'; yield; end
def baz; puts 'baz'; yield; end

def hoge
  foo do
    bar do
      baz do
        puts 'yeah!'
      end
    end
  end
end

ということをしたいときにhogeの定義の中でfoo doなどを書かずに済む方法が知りたい.1.9 ならさっくりできるんだろーか.

[:foo, :bar, :baz].reverse.each do |block|
  # ...
end

程度の見易さでできればなあ.関数合成できるのが一番スマートな気はしないでもないけど…….

ごにょごにょ.

def foo_bar_baz(&block)
  a = []
  [:foo, :bar, :baz].each do |f|
    a.push proc{ method(f).call &a.shift }
  end
  a.push block
  a.shift.call
end

foo_bar_baz { puts "YEAR!" }
#=> "foo!\nbar!\nbaz!\nYEAR!\n"

あからさまに遅いような気はするけど,まぁこんな感じなのかな…….

なんでこんな話が出てきたかというと,ActiveRecord で条件によっていろいろな with_scope({ :find => {:conditions => "..." }}) do を付けると便利かもしれない! という話なんですけど,さて…….