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 'no_plan';

use Devel::Events::Generator::SubTrace;

use Devel::Events::Handler::Callback;

my @events;

my $h = Devel::Events::Handler::Callback->new(sub {
	my ( $type, %args ) = @_;
	push @events, [ $type => $args{name}, ( $type eq 'enter_sub' ? $args{args}[0] : $args{ret} ) ];
});

my $o = Devel::Events::Generator::SubTrace->new( handler => $h );

sub bar { 42 + shift }
sub foo { bar(2) + bar(5) + shift }

$o->enable;

my $v = foo(3);

$o->disable;

is( $v, ( 42 + 2 + 42 + 5 + 3 ), "values unchanged" );

is_deeply(
	\@events,
	[
		[ enter_sub => 'main::foo' => 3 ],
			[ enter_sub => 'main::bar' => 2 ],
			[ leave_sub => 'main::bar' => 44 ],
			[ enter_sub => 'main::bar' => 5 ],
			[ leave_sub => 'main::bar' => 47 ],
		[ leave_sub => 'main::foo' => ( 47 + 44 + 3 ) ],
	],
	"call chain events",
);