The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use warnings;
use strict;
use Test::More tests => 4;
use File::Spec;

{
    package Foo;
    use Moose;

    has net_twitter => is => 'rw', required => 1;

    sub whois {
        my ( $self, $id ) = @_;

        # $line follows, should be reported as frame 0 in the stack trace
        $self->net_twitter->show_user($id);
    }
}

my $line = __LINE__ - 4; # is there a better way to do this? 

use Net::Twitter;
use HTTP::Response;
use Try::Tiny;

my $nt = Net::Twitter->new(legacy => 0);

$nt->ua->add_handler(request_send => sub {
    my $res = HTTP::Response->new(403);
    $res->content('{"errors":[{"code":63,"message":"User has been suspended"}]}');
    $res;
});


my $foo = Foo->new(net_twitter => $nt);
try { $foo->whois(1234) }
catch {
    like $_->error, qr/suspended/, 'stringified error contains twitter error message';
    
    my $frame = $_->stack_trace->frame(0);
    my $file = File::Spec->canonpath(__FILE__);
    my $file_in_frame = File::Spec->canonpath($frame->{filename});
    is $file_in_frame, $file, "first stack frame file";
    is $frame->{line}, $line, "first stack frame line";
    like $_->error, qr( at \Q$file\E line $line$), 'error contains first stack frame';
};