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++

ソースはちゃんと読んで理解しないとダメってことすね。