#!perl -w use strict; use Test::More; use Text::Xslate; { package _defer; use overload '@{}' => sub { $_[0]->() }, '%{}' => sub { $_[0]->() }, fallback => 1; package _str; use overload '""' => sub { 'foo' }; } sub defer(&) { my($coderef) = @_; return bless $coderef, '_defer'; } my $tx = Text::Xslate->new(verbose => 0); my @data = ( ['Hello, : for $types -> ($type) { [<:= $type :>] : } world!' => "Hello,\n[Str]\n[Int]\n[Object]\nworld!"], ); my %vars = ( types => defer { [qw(Str Int Object)] }, ); foreach my $pair(@data) { my($in, $out, $msg) = @$pair; is $tx->render_string($in, \%vars), $out, $msg or do { diag($in); my $code = $tx->compile($in); diag("// assembly"); diag($tx->_compiler->as_assembly($code)); } for 1 .. 2; } ok ! eval { $tx->render_string(': for $foo -> $i { $i }', { foo => defer { 42 } }), ''; }, "broken overloading object"; is $tx->render_string(': for $foo -> $i { $i }', { foo => bless {}, '_str'}), ''; # is_array_ref() is_hash_ref() respect overloading if(0) { foreach my $x([], defer { [] }) { ok $tx->render_string(': is_array_ref($x)', { x => $x }), "is_array_ref($x)"; } foreach my $x(0, {}, bless [], defer { "foo" }) { ok $tx->render_string(': !is_array_ref($x)', { x => $x }), "!is_array_ref($x)"; } foreach my $x({}, defer { +{} }) { ok $tx->render_string(': is_hash_ref($x)', { x => $x }), "is_hash_ref($x)"; } foreach my $x(0, [], bless {}, defer { "foo" }) { ok $tx->render_string(': !is_hash_ref($x)', { x => $x }), "!is_hash_ref($x)"; } } # TODO: consider it later done_testing;