perl Mojolicious:1 perl

# コマンド実態
sub run {
# コマンドライン引数は@argsに格納されます
my ($self @args) = @_;

# コマンドライン引数をパースします
GetOptionsFromArray(¥@args d|debug => ¥(my $debug))
or die $self->usage;




Perlでフレームワークを使用するときはMojoliciousを使用することにしています。
とはいってもあまりちゃんと使ったことがないので、悩む点がちょこちょこありました。
Mojoliciousドキュメント 日本語訳をただ読んでみても理解が進まないので、とりあえず書いてみて確かめながら勉強中です。
何がわからなかったのか?

URLが多階層になった場合の記述がよくわかりませんでした。
たとえば、
http://localhost/test/
とかの場合だと、
Test.pm

$r->get( /test )->to( test#test );

で問題なく動きますし、
Test.pm

$r->get( /test/lowpage )->to( lowpage#test );

でも動くのですが、lib内のアプリ本体直下のファイル数がやたら増えるので嫌だし、何でもかんでもプレースホルダー使って取得してしまうのも間違っていると思うし、ぐちゃぐちゃして嫌なのでした。
もっと具体的に言えば、
$r->get( /hoge ) を Test::Hoge->hoge()
$r->get( /hoge/piyo ) を Test::Hoge->piyo()
にしたい、って感じです。
調べても全然出てこなくて。というか、文書を読んでも理解できなかっただけなんですけれど。
結論

試行錯誤の過程を書いても仕方がないので、結果を。

$r->get( /foo )->to( foo#foo );
$r->get( /foo/bar )->to( foo-bar#bar );
$r->get( /baz/qux )->to( baz-qux_quux#foo_bar );

と記述した場合、呼び出されるファイルは以下でした。

$r->get( /foo )->to( foo#foo );
コントローラ:lib/MyAPP/Foo.pm の sub foo
テンプレート:template/foo/foo.html.ep

$r->get( /foo/bar )->to( foo-bar#bar );
コントローラ:lib/MyAPP/Foo/Bar.pm の sub bar
テンプレート:template/foo/bar/bar.html.ep

$r->get( /baz/qux )->to( baz-qux_quux#foo_bar );
コントローラ:lib/MyAPP/Baz/QuxQuux.pm の sub foo_bar
テンプレート:template/baz/qux_quux/foo_bar.html.ep