diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Text/Handlebars.pm | 18 | ||||
-rw-r--r-- | lib/Text/Handlebars/Compiler.pm | 2 | ||||
-rw-r--r-- | lib/Text/Xslate/Syntax/Handlebars.pm | 17 |
3 files changed, 37 insertions, 0 deletions
diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm index 25075b1..a040504 100644 --- a/lib/Text/Handlebars.pm +++ b/lib/Text/Handlebars.pm @@ -90,6 +90,7 @@ sub options { my $options = $class->SUPER::options(@_); $options->{compiler} = 'Text::Handlebars::Compiler'; + $options->{helpers} = {}; return $options; } @@ -128,6 +129,23 @@ sub _register_builtin_methods { return $code->($vars, @args, $options); }; + + for my $helper (keys %{ $self->{helpers} }) { + $funcs->{$helper} = $self->{helpers}{$helper}; + } +} + +sub _compiler { + my $self = shift; + + if (!ref($self->{compiler})) { + my $compiler = $self->SUPER::_compiler(@_); + $compiler->define_helper(keys %{ $self->{helpers} }); + return $compiler; + } + else { + return $self->SUPER::_compiler(@_); + } } sub render_string { diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm index ae1738b..184b9b6 100644 --- a/lib/Text/Handlebars/Compiler.pm +++ b/lib/Text/Handlebars/Compiler.pm @@ -9,6 +9,8 @@ has '+syntax' => ( default => 'Handlebars', ); +sub define_helper { shift->parser->define_helper(@_) } + sub _generate_block { my $self = shift; my ($node) = @_; diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index 252b4c9..a24fa00 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -5,6 +5,8 @@ use Any::Moose; use Carp 'confess'; use Text::Xslate::Util qw($DEBUG $NUMBER neat p); +use Text::Handlebars::Symbol; + extends 'Text::Xslate::Parser'; use constant _DUMP_PROTO => scalar($DEBUG =~ /\b dump=proto \b/xmsi); @@ -29,6 +31,8 @@ sub _build_tag_end { '}}' } sub _build_shortcut_table { +{} } +sub symbol_class { 'Text::Handlebars::Symbol' } + sub split_tags { my $self = shift; my ($input) = @_; @@ -584,6 +588,19 @@ sub define_function { return; } +sub define_helper { + my $self = shift; + my (@names) = @_; + + $self->define_function(@names); + for my $name (@names) { + my $symbol = $self->symbol($name); + $symbol->is_helper(1); + } + + return; +} + sub parse_literal { my $self = shift; my ($literal) = @_; |