Closureにメソッド足すにはExpandoMetaClass.enableGlobally()が必要

これはまぁ、{}でクロージャ作るたびにClosureのサブクラスが一つできるので当たり前なんですけど、エラーがちょっとわかりにくいんですね。メソッドが呼べない訳ではなくて、delegateが適切にセットされなくなる。
なんでdelegateを使わないメソッドを足す分にはExpandoMetaClass.enableGlobally()しなくても動いちゃったりする。ちょっとトリッキーな気がします。
[GROOVY-3674] In Closure as injected method of Closure, delegate is not collect - jira.codehaus.orgを読むと説明してあるんですけど…ちょっと英語の読解力がついていきませんでした^^;
ま、とにかく本来動かないものがなんとなく呼べちゃってるけど、ExpandoMetaClass.enableGlobally()しないとClosureクラスへの拡張は個々のクロージャには適切に反映されません。別クラスだし。
…位に理解しときゃいいのかなぁ?と思います。


ただし、ExpandoMetaClass.enableGlobally()すると劇重になるらしいので、ご注意ください。動的メソッドの検索範囲が一気に増えますから、そりゃ、ねぇ。
どっかで読んだだけで検証した訳じゃないのでもしかしたらもうそんな重くないかもしれませんが、まぁ博打ですよね。やっちゃってどうなっても私はしりませんよっと;-p