サブルーチンのアトリビュートで苦労する

サブルーチンのアトリビュート - daily dayflower で書きましたように,オリジナルなアトリビュートを使ううえで,本当は Attribute::Handlers を使うべきですが,mod_perl ではうまく動きません*1。理由は…うーん,いまいちわかりません。CHECK とか INIT の部分で何かやろうとしているからですかね?

Yappo さんの記事に従って attributes ベースでやってみました。こちらの MODIFY_xxx_ATTRIBUTES というやつは mod_perl でも動きました。よかったよかった。おもしろいですね,これ。
前も書きましたが,このアトリビュートまわりは,コンパイルフェーズにおいて実行されます。しかも,MODIFY_xxx_ATTRIBUTES には,対象となるオブジェクトのリファレンスも渡されます。だから,Catalyst では,コンパイルフェーズのうちにアクション関数へのリファレンスをキャッシュしておくことで,効率化をはかっているんですね。あと,Regex アトリビュートとかでも,引数の正規表現を1回だけコンパイルしたりとか。
MODIFY_xxx_ATTRIBUTES まわりの仕様が fix されて,このまま使っていていいよとなるとうれしいんだけどなぁ〜

*1:それでも宣言したアトリビュート自体は認められるようになります。その他のアトリビュートを使うと,きちんと?エラーになります。コンパイル時のトラッピングができないだけです。だから実質つかえません。