The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package IO::Statistics;
use 5.008;
use strict;
use warnings;
use PerlIO::via::dynamic '0.10';
our $VERSION = '0.12';

=head1 NAME

IO::Statistics - Transparently perform statistics on IO handles

=head1 SYNOPSIS

 use IO::Statistics;

 my ($read, $write) = (0, 0);
 IO::Statistics->count (\$read, \$write, \*STDOUT);

 # alternatively:
 $ios = IO::Statistics->new (\$read, \$write);
 $ios->via (\*STDOUT);

 print "fooo";
 print "bkzlfdlkf\n";

 END {
    print "read $read bytes read, wrote $write bytes\n";
 }

=head1 DESCRIPTION

This module allows you to count IO activity on a file handle transparently.

=cut

sub new {
    my ($class, $read, $write) = @_;
    my %map = (translate => $write, untranslate => $read);

    return PerlIO::via::dynamic->new
	( use_read => 1,
	  map { my $ref = $map{$_};
		$ref ? ($_ => sub { $$ref += length ($_[1])}) : ()
	    } keys %map);

}

sub count {
    my ($class, $read, $write, @handle) = @_;
    my $ios = $class->new ($read, $write);
    die "more than one handle not supported yet" if $#handle > 0;
    $ios->via ($_) for @handle;
}

=head1 BUGS

Using this IO layer on a global filehandle might result in segfault on
C<perl_destruct>.

=head1 TEST COVERAGE

 ----------------------------------- ------ ------ ------ ------ ------ ------
 File                                  stmt branch   cond    sub   time  total
 ----------------------------------- ------ ------ ------ ------ ------ ------
 blib/lib/IO/Statistics.pm            100.0  100.0    n/a  100.0  100.0  100.0
 Total                                100.0  100.0    n/a  100.0  100.0  100.0
 ----------------------------------- ------ ------ ------ ------ ------ ------

=head1 AUTHORS

Chia-liang Kao E<lt>clkao@clkao.orgE<gt>

=head1 COPYRIGHT

Copyright 2004 by Chia-liang Kao E<lt>clkao@clkao.orgE<gt>.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

See L<http://www.perl.com/perl/misc/Artistic.html>

=cut

1;