use warnings; use strict; { package Indent; sub new { my $c=shift; bless { i=>shift//"\t", c=>0 }, $c } use overload '++' => sub { ++shift->{c} }, '--' => sub { my $s=shift; $$s{c}=0 if --$$s{c}<0; $$s{c} }, '""' => sub { my $s=shift; $$s{i} x $$s{c} }, '=' => sub { my $s=shift; bless {%$s}, ref $s }, } my $recurse; $recurse = sub { my ($lvl,$i) = @_ ? @_ : (0, Indent->new("foo")); print "<", $i++, "> Enter\n"; $recurse->($lvl+1,$i) unless $lvl>=2; print "<", --$i, "> Leave\n"; }; $recurse->(); __END__ <> Enter Enter Enter Leave Leave <> Leave