Catalyst Tips #1 default アクションでの args の扱い

Catalyst では /controller/action/foo/bar といった パスでアクセスした場合、$c->req->args->[0] で foo、$c->req->args->[1] で bar が取り出せるのですが、/controller/foo/bar といったアクションの指定がないパスだと、$c->req->args->[0] には controller が入ってしまいます。

$c->req->args は Catalyst::Dispatcher の prepare_action メソッドでセットされるのですが、default アクションが呼び出される場合には、更に Catalyst::DispatchType::Default 中の以下のコードが実行され、$c->req->args に コントローラ名がつっこまれる、という仕様になっているようです。

# default methods receive the controller name as the first argument
unshift @{ $c->req->args }, $path if $path;  

default アクションとその他のアクションで、$c->req->args の値の入り方が違うのは気持ち悪いし、共通のサブルーチンで args を処理する場合に面倒なので、以下の様なコードで回避することにしました。

sub default : Private {
    my ( $self, $c ) = @_;
    shift @{ $c->req->args };
    ...
}

それにしても、なぜ default アクションの場合、コントローラ名を args に入れる必要があるんだろう?