TT の Multi Provider
CLON - 2006/11/27 - 複数のアプリで共通のテンプレートファイルを使うこれ、 [% INCLUDE 'common:foo.tt' %] とかしたとき、さらに foo.tt の中で [% INCLUDE 'bar.tt' %] とすると common:bar.tt がインクルードされてほしいのだけどそうはならないのがびみょい。
typester さんは カスタム TT::Provider を書いて解決なさってますけど,ちょっとだけださくないバージョンを考えてみました。
package Template::Context::TrackingProvider; use strict; use base qw( Template::Context ); sub template { my $self = shift; my $name = $_[0]; if (! ref $name) { if ($name =~ m'^(\w+):'o) { my $prefix = $1; # ホントは SUPER::template() の後でやりたいけど支障なし $self->{ PREFIX_MAP }->{ default } = $self->{ PREFIX_MAP }->{ $prefix }; } } return $self->SUPER::template(@_); } sub process { my $self = shift; my $backup = $self->{ PREFIX_MAP }->{ default }; my $r = $self->SUPER::process(@_); $self->{ PREFIX_MAP }->{ default } = $backup; return $r; } 1;
いろんな意味でだせぇ。
- 名前がださい
- 様々な例外条件チェック(PREFIX_MAP がない場合とか)をしてないのがださい
- $backup とかださい*1
他,テンプレートをコンパイルした場合とかわかんないし,INCLUDE / PROCESS に複数引数を指定した場合がどうだかわかんないですけど,プロトタイプってことで。
追記
ちょっと修正した
*1:local 使うよりこっちのほうが短いんだもの