秋田です。

> |> ただ、この動作イメージが良く分からなかったのでもうちょっと説
> |> 明していただけませんか?
> |>
> |もともとは複数の yield を扱えないか?
> |という発想ですが、フックの方が意味が近いのでフックと表現しました。
> 
> うーん、この場合フックが呼ばれるタイミングはいつですか? も
> しかして、add_hookを呼んだとき? Emacsのadd-hookを思い出して、
> あんまりフックを実行するイメージじゃなかったんですが。もしか
> して、run_hookの方が良い?
> 
実装について、フックと表現しましたが、
EmacsLispではhookを利用しても、モードなどの作成に挫折したクチですので
あまり厳密にとらえないでください(^^;。

begin # beginブロック
  #beginブロック(a)
hook
  #hookブロック
end

フックが読まれるタイミングは、begin ブロック(a)内のメソッドが実行される時です。

処理手順に対するイメージは、
(1) begin内にhook ブロックが存在するのでそれを覚えておく。
(2) beginブロック(a)でメソッドが実行される。
(3) メソッド中に add_hook があり かつ (1)の hookブロックのシンボル
名(:cache_name)が一致したら、hookブロックを実行。hookブロックがない時は、
hookブロックが存在しなかったという戻り値(nil)を返す。
(nilの場合ディフォルトの処理をする)
(4)(2)〜(3)をbeginブロック(a)内で続ける。

(2)-(3)と等価なアプローチとして、
beginブロック(a)内のすべてのメソッドを評価する。
メソッド内に hookブロックに対応する add_hook が存在すれば、
hookブロック内の処理で置き換える。
置き換えるものがない時はadd_hookの戻り値を nil に置き換える。


(1)-(4)をbeginブロックを評価する毎に行なう。

--