package Filter::Handle;
use strict;
use Carp;
sub PRINT {
my $self = shift;
my $fh = $self->{fh};
print $fh $self->{disp}->(@_);
}
sub PRINTF {
my $self = shift;
@_ = ($self, sprintf(shift, @_));
goto &PRINT;
}
sub TIEHANDLE {
my $class = shift;
my $fh = shift or croak("Need a filehandle to tie to.");
my $disp = shift ||
sub {
my ($file, $line) = (caller(1))[1,2];
sprintf("%s:%d - %s\n", $file, $line, "@_");
};
return bless ({fh => $fh, disp => $disp}, $class);
}
# An OO interface for free! :-)
*new = *TIEHANDLE;
*print = *PRINT;
*printf = *PRINTF;
1;
####
my $out = new Filter::Handle(\*STDOUT);
$out->print("Hello world\n");
$out->printf("%s %s\n", "Hello", "world");
##
##
tie (*OUT, 'Filter::Handle', \*STDOUT);
select(OUT);
print "Hello world\n";
printf ("%s %s\n", "Hello", "world");