use constant TAXES => sub { my $i = 0; my @stack; my $stamp = scalar(gmtime()); #FIXME my($pa,$fi,$li,$fu); STACKFRAME: while(caller(++$i)) { my($pack,$file,$line,$func) = caller($i); #( $pack eq 'Z::Weblet' ) && next STACKFRAME; #( $func eq 'Z::Weblet::run' ) && ($func = "$pack\:\:main"); if( !$pa ) { ($pa,$fi,$li,$fu) = ($pack,$file,$line,$func) } push( @stack, $func ); } CORE::warn( "[$stamp] $fi\@$li: ",join(' <- ', @stack)," - ", @_ ); }; use constant DEATH => sub { if( $^S ) { die( @_ ) } else { my($pack,$file,$line,$func) = caller(1); my $stamp = scalar(gmtime()); #FIXME my $locn = ($file && $line) ? join('', ' ', $file, '@', $line) : ''; die( "[$stamp]$locn: $func - ", @_ ); } }; $SIG{__DIE__} = DEATH; $SIG{__WARN__} = TAXES;