#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Sub::Identify; use Sub::Install; sub g { my $i = shift; return 1 if $i == 0; return $i * g->($i-1); } # Decorator sub trace_sub { my $sub = shift; my $subname = Sub::Identify::sub_name( $sub ); my $lvl = 0; Sub::Install::reinstall_sub({ code => sub { my @args = @_; print " " x $lvl++ ."called $subname(" . join(', ', @args) .")\n" ; my $value = $sub->(@args); print " " x --$lvl ."$subname(". join(', ', @args) .") returns $value\n"; return $value; }, as => $subname, }); return; } trace_sub(\&g); print g(4);