北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Amon2のソースを読む(5)

今日はAmon2-2.49DSL周り。これで最後。

Amon2::Declare

$c じゃなくて c() 使えたらいいよねって話。内容物の中では、t/ 内のExtended::V::MT::Context にて、テンプレからcを呼び出せるようにするために使っている。

Amon2::Lite

Sinatra-ish な書き方ができるようにするもの。Amon2::Lite::_child_N という名前でコンテクストクラスを作る。Nは連番なので、package名さえ分ければ複数箇所から利用が可能*1

use 元にはルーティングに必要な関数をエクスポートする。2.49 の実装では Router::Simple::Sinatraish は使わずに自前で実装している。さらにコンテキストにはdispatch と create_view が必須なのでこれらを実装。create_view では__DATA__ セクションを読むために初回呼び出し時までテンプレのロードを遅らせている。このときにuse 側のくらすにcreate_view メソッドを生やし、ロードが複数回走らないようにしている。デフォルトで作成されるビューは TT2Like。また、Liteではconfigディレクトリが無い可能性があるので、config/ ディレクトリが無くても落ちることがないようにload_config() メソッドを上書きしている。

その他

create_view で作成されるテンプレートにはrender メソッドが要求されるため、Xslate 以外のテンプレートを使うときにちょっと困るが、その場合はTiffany を経由させるとよい。その辺はLite の PODや t/apps/Extended のExtended::Web 辺りを見ればわかる。

*1:Plack::Util::load_psgi を使えばpackageは自動的にサンドボックスの中になる