Как создать специальный 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;

Лексер не распознает их как идентификаторы. Изменение модуля для принятия ведущих _ кажется далеко не тривиальным.

Другие вопросы по тегам