use Filter::Handle; my $f = Filter::Handle->new(\*STDOUT); print "Foo"; print "Bar"; #### package Filter::Handle; use strict; sub new { my $class = shift; my $fh = shift; tie *{$fh}, 'Filter::Handle::Tie', $fh; bless { fh => $fh }, $class; } sub DESTROY { my $self = shift; my $fh = $self->{fh}; undef $self; { local $^W = 0; untie *{$fh} } } package Filter::Handle::Tie; use vars qw/@ISA/; use Tie::Handle; @ISA = qw/Tie::Handle/; sub TIEHANDLE { my $class = shift; my $fh = shift; bless { fh => $fh }, $class; } sub PRINT { my $self = shift; my $fh = $self->{fh}; my($file, $line) = (caller)[1,2]; { local $^W = 0; untie *{$fh} } print $fh sprintf "%s:%d - %s\n", $file, $line, join ' ', @_; tie *{$fh}, __PACKAGE__, $fh; } 1;