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 使うよりこっちのほうが短いんだもの