use strict; use warnings; use Carp; use Test::More tests => 7; { my %Line; use Devel::LineName linename => \%Line; eval { die "oops"; use linename 'foo'; }; is $@, "oops at $0 line $Line{foo}.\n", "SYNOPSIS example"; } { my %Line; use Devel::LineName linename => \%Line; eval { use linename 'eval'; outer_sub(); use linename 'outer_call'; }; my $goterr = $@; $goterr =~ s/[.]\n/\n/g; is $goterr, < \%Line; eval { use linename 'eval'; outer_sub2(); use linename 'outer_call'; }; my $goterr = $@; $goterr =~ s/[.]\n/\n/g; is $goterr, < \%Line; eval { die 'foo'; use linename 'foo'; }; like $@, qr/ line $Line{foo}\./, "linename on same line"; eval { die 'bar'; use linename 'bar', -1; }; like $@, qr/ line $Line{bar}\./, "linename on line below"; eval { use linename 'baz', +1; die 'baz'; }; like $@, qr/ line $Line{baz}\./, "linename on line above"; } { my %Line; use Devel::LineName linename => \%Line; sub foo { return 17; use linename 'fooreturn'; } is foo(), 17, "linename doesn't interfere with return value"; }