sub warn { my @messages = @_; unless (@messages) { @messages = "Warning: something's wrong"; } if ($messages[-1] !~ /\n$/) { my ($package, $file, $line) = caller(); $messages[-1] .= " at $file line $line\n"; } if ($SIG{__WARN__}) { $SIG{__WARN__}->(@messages); } else { print STDERR @messages; } } #### sub die { my @messages = @_; unless (@messages) { @messages = "Warning: something's wrong"; } if ($messages[-1] !~ /\n$/) { my ($package, $file, $line) = caller(); $messages[-1] .= " at $file line $line\n"; } if ($SIG{__DIE__}) { $SIG{__DIE__}->(@messages); } foreach level (travel up the callstack) { if (this level is trapping exceptions) { $@ = join "", @messages; transfer control to where that's caught. } } unless ($SIG{__DIE__}) { print STDERR @messages; exit(255); } }