NAME
   PerlIO::via::Limit - PerlIO layer for length restrictions

SYNOPSIS
       use PerlIO::via::Limit;
       PerlIO::via::Limit->length(256);
       # - or -
       use PerlIO::via::Limit length => 256;

       # reading
       open( my $fh, "<:via(Limit)", $file );

       # writing
       open( my $fh, ">:via(Limit)", $file );

       # If you want to use various limits simultaneously
       my $limit256 = PerlIO::via::Limit->create(256);
       my $limit512 = PerlIO::via::Limit->create(512);
       open( my $fh256, "<:via($limit256)", $hoge );
       open( my $fh512, ">:via($limit512)", $fuga );

DESCRIPTION
   PerlIO::via::Limit implements a PerlIO layer that restricts length of
   stream.

   There is an important constraint, it is able to specify only one limit
   value within application because the 'length' is a class data.

   The following example does not work as expected:

       PerlIO::via::Limit->length(256);
       open( my $fh1, "<:via(Limit)", $file1 );

       PerlIO::via::Limit->length(512);
       open( my $fh2, "<:via(Limit)", $file2 );

       local $/ = undef;
       my $data1 = <$fh1>;
       my $data2 = <$fh2>;

       CORE::length($data1); # is not 256 but 512
       CORE::length($data2); # is also 512

   Therefore, it is necessary to divide namespace, in order to use two or
   more limit values simultaneously.

       package Foo;
       use base PerlIO::via::Limit;

       package main;
       PerlIO::via::Limit->length(256);
       Foo->length(512);

       open( my $fh1, "<:via(Limit)", $file1 );
       open( my $fh2, "<:via(Foo)", $file2 );

       local $/ = undef;
       my $data1 = <$fh1>;
       my $data2 = <$fh2>;

       CORE::length($data1); # is 256
       CORE::length($data2); # is 512

   Actually you do not have to code like the above, instead, the create()
   method supports it by simple interface.

       my $limit256 = PerlIO::via::Limit->create(256);
       my $limit512 = PerlIO::via::Limit->create(512);

       open( my $fh1, "<:via($limit256)", $file1 );
       open( my $fh2, "<:via($limit100)", $file2 );

CLASS METHODS
 create
   Create an anonymous class that is inheritable PerlIO::via::Limit.

   You do not have to care about the class, only pass ':via' the returned
   value as it is.

   It accepts an optional parameter for 'length' available.

       my $limit = PerlIO::via::Limit->create(512);
       open( my $fh, ">:via($limit)", $file );

   Also it can call 'length' and 'sensitive' class methods.

       my $limit = PerlIO::via::Limit->create;
       $limit->length(256);
       $limit->sensitive(0);
       open( my $fh, ">:via($limit)", $file );

 length
   Limit length of stream. Default is undef that means unlimited.

 sensitive
   If set true value, an exception will be occurred when stream reaches
   limit of length. Default is false.

       use PerlIO::via::Limit sensitive => 1;

       open( my $in, "<:via(Limit)", $file ) or die;
       eval {
           while( <$in> ){
               # do something...
           }
       };if( $@ ){
           # "$in is trying to read exceeding the limit."
           warn "$@";
       }
       close $in or die;

   Note that the $@ is an Exception::Class object.

BUGS
   When the exception is thrown by sensitive option, the buffer for reading
   does not be filled.

REPOSITORY
   PerlIO::via::Limit is hosted on github
   <https://github.com/hiroaki/PerlIO-via-Limit>

SEE ALSO
   PerlIO::via

   Exception::Class

AUTHOR
   WATANABE Hiroaki <[email protected]>

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