Set the entry point in PSGI

PSGIスクリプトはコードリファレンスを返さなければならないということで,スクリプトを以下のようなレイアウトにしなければならないと考えがちだ。

#!perl-w
use strict;

[モジュールのロード]

[ユーティリティ関数群]

sub {
    [メインルーチン]
};
__END__

しかしPSGIの要求はコードリファレンスであって,必ずしも無名関数である必要はない。むしろ,メインルーチンにも名前が付いていたほうがデバッグ等がしやすいのではないかと思う。
そこで,以下のように名前付き関数をエントリポイントにするというレイアウトを提案する。

#!perl-w
use strict;

[モジュールのロード]

sub psgi_main {
    [メインルーチン]
}

[ユーティリティ関数群]

return \&psgi_main;
__END__

ポイントは,最後の return \&psgi_main; だ。このように明示的にコードリファレンスを返すことで,任意の関数をエントリポイントに設定できる。メリットは,スクリプトのレイアウトを自由に決められることと,スタックトレースが読みやすくなることである。

(追記:ブクマコメントより)
miyagawa:

ある程度の規模になったら、アプリのコードは全部.pm にして .psgi はそれを sub { } で呼び出すだけ、になるかんじでしょうね

そうなると,スクリプトのレイアウトについては関係なくなりますね。しかしその場合でも return \&MyApp::run; とすることができます。この辺は好みだと思いますが。