The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

use Sub::Call::Tail;

use B::Deparse;

sub bar { (caller(1))[3] }

sub invoke {
    my $sub = shift;
    $sub->();
}

my $foo = bless {};

foreach my $sub ( sub { tail bar() }, sub { tail $foo->bar() }, sub { tail &bar }, sub { goto &bar } ) {
    is( invoke(\&bar), "main::invoke", "normal call" );
    is( invoke($sub), "main::invoke", "tail call" );

    my $source = B::Deparse->new->coderef2text($sub);

    like( $source, qr/tail|goto/, "source mentions tail or goto" );

    my $new = eval "sub $source";

    is( ref($new), 'CODE', "compiled a coderef" );

    is( invoke($new), "main::invoke", "compiled coderef has valid tail call" );
}

done_testing;

# ex: set sw=4 et: