summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Text/Handlebars.pm18
-rw-r--r--lib/Text/Handlebars/Compiler.pm2
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm17
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) = @_;