summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-14 13:47:40 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-14 14:38:14 -0500
commit131eb38b3800c8ede6e3b981538edfc062ef7a0b (patch)
treef68d1f2f27b7a0c09e1ac53ef92832174ce95b0d
parent1bd9194b87f14c81133a8d1a4d17ca02d787dc5c (diff)
downloadtext-handlebars-131eb38b3800c8ede6e3b981538edfc062ef7a0b.tar.gz
text-handlebars-131eb38b3800c8ede6e3b981538edfc062ef7a0b.zip
this doesn't need to be a function either
-rw-r--r--lib/Text/Handlebars.pm9
-rw-r--r--lib/Text/Handlebars/Compiler.pm55
2 files changed, 53 insertions, 11 deletions
diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm
index 0a02f77..d104003 100644
--- a/lib/Text/Handlebars.pm
+++ b/lib/Text/Handlebars.pm
@@ -124,15 +124,6 @@ sub default_functions {
return {
%{ $class->SUPER::default_functions(@_) },
%{ $class->default_helpers },
- '(is_falsy)' => sub {
- my ($val) = @_;
- if (ref($val) && ref($val) eq 'ARRAY') {
- return @$val == 0;
- }
- else {
- return !$val;
- }
- },
'(is_code)' => sub {
my ($val) = @_;
return ref($val) && ref($val) eq 'CODE';
diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm
index 48844d1..0282fff 100644
--- a/lib/Text/Handlebars/Compiler.pm
+++ b/lib/Text/Handlebars/Compiler.pm
@@ -126,7 +126,7 @@ sub _generate_block {
}
my $iterations = $self->make_ternary(
- $self->call($node, '(is_falsy)', $name->clone),
+ $self->is_falsy($name->clone),
$self->make_array($self->parser->literal(1)),
$self->make_ternary(
$self->is_array_ref($name->clone),
@@ -139,7 +139,7 @@ sub _generate_block {
my $body_block = [
$self->make_ternary(
- $self->call($node, '(is_falsy)', $name->clone),
+ $self->is_falsy($name->clone),
$name->clone(
arity => 'block_body',
first => undef,
@@ -216,6 +216,24 @@ sub is_unary {
return $unary{$id};
}
+sub _generate_array_length {
+ my $self = shift;
+ my ($node) = @_;
+
+ my $max_index = $self->parser->symbol('(max_index)')->clone(
+ id => 'max_index',
+ arity => 'unary',
+ first => $node->first,
+ );
+
+ return (
+ $self->compile_ast($max_index),
+ $self->opcode('move_to_sb'),
+ $self->opcode('literal', 1),
+ $self->opcode('add'),
+ );
+}
+
sub call {
my $self = shift;
my ($node, $name, @args) = @_;
@@ -297,6 +315,39 @@ sub make_hash {
);
}
+sub is_falsy {
+ my $self = shift;
+ my ($node) = @_;
+
+ return $self->not(
+ $self->make_ternary(
+ $self->is_array_ref($node->clone),
+ $self->array_length($node->clone),
+ $node
+ )
+ );
+}
+
+sub not {
+ my $self = shift;
+ my ($node) = @_;
+
+ return $self->parser->symbol('!')->clone(
+ arity => 'unary',
+ first => $node,
+ );
+}
+
+sub array_length {
+ my $self = shift;
+ my ($node) = @_;
+
+ return $self->parser->symbol('(array_length)')->clone(
+ arity => 'array_length',
+ first => $node,
+ );
+}
+
__PACKAGE__->meta->make_immutable;
no Any::Moose;