summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Text/Handlebars.pm26
-rw-r--r--lib/Text/Handlebars/Compiler.pm1
-rw-r--r--t/block-helper-builtins.t2
3 files changed, 18 insertions, 11 deletions
diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm
index 63ef398..87a47f5 100644
--- a/lib/Text/Handlebars.pm
+++ b/lib/Text/Handlebars.pm
@@ -149,15 +149,23 @@ sub _register_builtin_methods {
return $weakself->render_string($to_render, $vars);
};
$funcs->{'(make_block_helper)'} = sub {
- my ($code, $raw_text, $else_raw_text, $hash) = @_;
+ my ($vars, $code, $raw_text, $else_raw_text, $hash) = @_;
my $options = {};
$options->{fn} = sub {
my ($new_vars) = @_;
+ $new_vars = {
+ %{ canonicalize_vars($new_vars) },
+ '..' => $vars,
+ };
return $weakself->render_string($raw_text, $new_vars);
};
$options->{inverse} = sub {
my ($new_vars) = @_;
+ $new_vars = {
+ %{ canonicalize_vars($new_vars) },
+ '..' => $vars,
+ };
return $weakself->render_string($else_raw_text, $new_vars);
};
$options->{hash} = $hash;
@@ -188,23 +196,23 @@ sub render_string {
my $self = shift;
my ($string, $vars) = @_;
- if (ref($vars) && ref($vars) eq 'HASH') {
- return $self->SUPER::render_string(@_);
- }
- else {
- return $self->SUPER::render_string($string, { '.' => $vars });
- }
+ return $self->SUPER::render_string($string, canonicalize_vars($vars));
}
sub render {
my $self = shift;
my ($name, $vars) = @_;
+ return $self->SUPER::render($name, canonicalize_vars($vars));
+}
+
+sub canonicalize_vars {
+ my ($vars) = @_;
if (ref($vars) && ref($vars) eq 'HASH') {
- return $self->SUPER::render(@_);
+ return $vars;
}
else {
- return $self->SUPER::render($name, { '.' => $vars });
+ return { '.' => $vars };
}
}
diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm
index 5b99471..30aca1a 100644
--- a/lib/Text/Handlebars/Compiler.pm
+++ b/lib/Text/Handlebars/Compiler.pm
@@ -146,6 +146,7 @@ sub _generate_block {
first => $self->call(
$node,
'(make_block_helper)',
+ $self->vars,
$name->first,
$block{if}{raw_text}->clone,
($block{else}
diff --git a/t/block-helper-builtins.t b/t/block-helper-builtins.t
index dac692e..504b350 100644
--- a/t/block-helper-builtins.t
+++ b/t/block-helper-builtins.t
@@ -196,7 +196,6 @@ RENDERED
"unless helper (true)"
);
-{ local $TODO = "unimplemented"; local $SIG{__WARN__} = sub { };
render_ok(
<<'TEMPLATE',
<ul class="people_list">
@@ -222,6 +221,5 @@ TEMPLATE
RENDERED
"each helper with ../"
);
-}
done_testing;