motivation: デフォルトのアプリケーションをセットしたい。

↓起動

CGI::ExceptionManager->run(
    callback   => \&NanoA::Dispatch::dispatch,
    powered_by => 'NanoA',
);

NanoA::Dispatch以下

  • PATH_INFOから$handler_path取得
  • $handler_pathがからの場合→app/indexディレクトリがあったら、/index/にリダイレクト
  • ..を消す→ディレクトリとラバー去る
  • $handler_pathが/で終わってたら→startに振る
  • NanoA::Configを初期化確認
  • $handler_pathでload_config
    • $handler_pathから$app_name取得→できなかったらsystem
    • $app_name以下にconfig.pmがあったらロード→なかったらNanoA::Configをロード
    • ロードしたconfigを({app_name => $app_name})でインスタンス化して返す
  • configにcamelizeがあったら$handler_pathをcamelize
  • load_handlerで$handler_klassを導出
sub load_handler {
    my ($klass, $config, $path) = @_;
    my $handler_klass;

    foreach my $loader (@{$config->loaders}) {
        $handler_klass = $loader->($klass, $config, $path)
            and last;
    }

    $handler_klass;
}
  • NanoA::Configのloadersは
        loaders       => [
            \&NanoA::Dispatch::load_mojo_template,
            \&NanoA::Dispatch::load_pm,
        ],
  • mtをロードする→なかったらpmをロード
  • このときconfigが関係あるのはmtのロードのときにcacheディレクトリの指定を見る
    • デフォルトは↓こう
        mt_cache_dir  => "/tmp/nanoa.${NanoA::VERSION}.$>.mt_cache",
  • みつかんなかったらnot_foundハンドラをロード
  • あとはそいつを実行

で、結局のところなんでデフォルトがああいうのかというと、

        not_found     => 'system/not_found',

となっていて、app/system/not_found.mtが↓こうなってて、system/app_listになってるから。

? my $pi = $app->query->path_info;
? return $app->render('system/app_list') unless $pi;
<? $app->header(-status => 404); ?>
<?= $app->render('system/header') ?>
<h2>File Not Found</h2>
File Not Found.  The list of installed applications can be found: <a href="<?= $app->nanoa_uri ?>">here</a>.
<?= $app->render('system/footer') ?>