Path::AttrRouterのControllerをextendsする時はBEGINで(って書いたけどやっぱり '-extends' で)
Path::AttrRouterを使うのに、
package MyController; use Any::Moose; extends 'Path::AttrRouter::Controller'; sub index :Path Args(0) { } 1;
みたいに書くと「Error while loading app.psgi: Invalid CODE attributes:」とか怒られてどうすればいいんだろう。
と思って#perl-casualで聞いてみたら、JPAの牧さんがあっさり「それBEGIN {}でできるよ」と解決してくれました。
package MyController; use Any::Moose; BEGIN { extends 'Path::AttrRouter::Controller' }
のように、extendsをBEGINでくくってやれば無問題。use baseはコンパイル時に評価されるけど、extendsは実行時なのでこれが必要らしいです。
catamooseが出た時にBEGINでどうこうって話が出て他のはこれだったのか。2010年にもなって引っかかってすいません。
ちょっと記述としては冗長だなと思うけど、
これがRoleとの関連で不採用になったりと、いろいろと経緯があったようです。
そんな疑問があっさり解決したり、関連トピックがいろいろ聞ける#perl-casualマジお勧め。
こういうショボい質問も皆が優しく教えてくれるので、Perl使ってる人はirc.freenode.netに今すぐアクセスした方がいいですよ。
(追記)Path::AttrRouterについては
package MyController; use Any::Moose; use Path::AttrRouter::Controller '-extends';
って書けばBEGINとか使わなくてもいいそうです。typester++
ソースはちゃんと読んで理解しないとダメってことすね。