Как создать специальный ROOT_OPS в Template-Toolkit?
Я использую Locale::TextDomain в среде Dancer с Template-Toolkit.
И да, я знаю Dancer-Plugin-I18N и пробовал его, но я не хочу его использовать!
Я прочитал Defining_Custom_Virtual_Methods и настроил его для своих нужд.
# load Template::Stash to make method tables visible
use Template::Stash;
$Template::Stash::ROOT_OPS->{ 'localize' } = sub {
return __(shift);
};
и в представлении
[% localize("Hello") %]
Это работает очень хорошо.
Но я хотел бы обернуть все функции Locale::TextDomain как:
$Template::Stash::ROOT_OPS->{__} = sub { return __x(shift) };
$Template::Stash::ROOT_OPS->{__x} = sub { return __x(shift, @_) };
$Template::Stash::ROOT_OPS->{__n} = sub { return __n(shift, shift, shift) };
$Template::Stash::ROOT_OPS->{__nx} = sub { return __nx(shift, shift, shift, @_) };
$Template::Stash::ROOT_OPS->{__xn} = sub { return __xn(shift, shift, shift, @_) };
$Template::Stash::ROOT_OPS->{__p} = sub { return __p(shift, shift) };
$Template::Stash::ROOT_OPS->{__px} = sub { return __px(shift, shift, @_) };
$Template::Stash::ROOT_OPS->{__np} = sub { return __np(shift, shift, shift, shift) };
$Template::Stash::ROOT_OPS->{__npx} = sub { return __npx(shift, shift, shift, shift, @_) };
но, к сожалению, невозможно использовать "__" или "__x" в качестве токена.
Итак, мой вопрос: как мне создать корневые операции '__' (и друзей) в Template-Toolkit?
2 ответа
Template Toolkit не экспортирует функции, начинающиеся с _, потому что они считаются закрытыми. Вы можете обойти это, установив перед операциями Stash следующее:
$Template::Stash::PRIVATE = 0;
Лексер не распознает их как идентификаторы. Изменение модуля для принятия ведущих _
кажется далеко не тривиальным.