The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;

use Text::Xslate;

my $tx = Text::Xslate->new(verbose => 2);

{
    package Obj;
    use Any::Moose;

    sub join :method {
        my($self, $sep, @args) = @_;
        return join $sep, @args;
    }

    sub ok { 42 }

    sub nil   { 'nil' }
    sub true  { 'true' }
    sub false { 'false' }
}
{
    package Anything;
    use Any::Moose;

    sub AUTOLOAD {
        our $AUTOLOAD;
    }
}

my @data = (
    [ <<'T', <<'X', "method call without args" ],
<: $obj.ok() :>
T
42
X

    [ <<'T', <<'X', "method call" ],
<: $obj.join(".") :>
T

X

    [ <<'T', <<'X', "method call" ],
<: $obj.join(".", "foo", "bar") :>
T
foo.bar
X

    [ <<'T', <<'X', "method call" ],
<: $obj.join(".", "foo", "bar", "baz") :>
T
foo.bar.baz
X


    [ <<'T', <<'X', "method call" ],
<: $obj.join(".", "foo", "bar", "baz") :>
T
foo.bar.baz
X

    [ <<'T', <<'X', "AUTOLOAD" ],
    <: $any.foo :>
    <: $any.bar :>
    <: $any.baz() :>
T
    Anything::foo
    Anything::bar
    Anything::baz
X

    [ <<'T', <<'X', "keywords" ],
    <: $obj.nil() :>
    <: $obj.true() :>
    <: $obj.false() :>
T
    nil
    true
    false
X

);

my %vars = (
    obj => Obj->new,
    any => Anything->new,
);
foreach my $d(@data) {
    my($in, $out, $msg) = @$d;

    is $tx->render_string($in, \%vars), $out, $msg or diag $in;
}

done_testing;