From 320d8694fec25ed148613684543b5a0504a046ae Mon Sep 17 00:00:00 2001 From: Siep Kroonenberg Date: Thu, 17 Feb 2011 17:57:31 +0000 Subject: New tlperl part XIV git-svn-id: svn://tug.org/texlive/trunk@21436 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm | 165 +++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm (limited to 'Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm') diff --git a/Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm b/Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm new file mode 100644 index 00000000000..09d40bebccb --- /dev/null +++ b/Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm @@ -0,0 +1,165 @@ +package TAP::Parser::Iterator; + +use strict; +use vars qw($VERSION @ISA); + +use TAP::Object (); + +@ISA = qw(TAP::Object); + +=head1 NAME + +TAP::Parser::Iterator - Internal base class for TAP::Parser Iterators + +=head1 VERSION + +Version 3.17 + +=cut + +$VERSION = '3.17'; + +=head1 SYNOPSIS + + # see TAP::Parser::IteratorFactory for general usage + + # to subclass: + use vars qw(@ISA); + use TAP::Parser::Iterator (); + @ISA = qw(TAP::Parser::Iterator); + sub _initialize { + # see TAP::Object... + } + +=head1 DESCRIPTION + +This is a simple iterator base class that defines L's iterator +API. See C for the preferred way of creating +iterators. + +=head1 METHODS + +=head2 Class Methods + +=head3 C + +Create an iterator. Provided by L. + +=head2 Instance Methods + +=head3 C + + while ( my $item = $iter->next ) { ... } + +Iterate through it, of course. + +=head3 C + +B this method is abstract and should be overridden. + + while ( my $item = $iter->next_raw ) { ... } + +Iterate raw input without applying any fixes for quirky input syntax. + +=cut + +sub next { + my $self = shift; + my $line = $self->next_raw; + + # vms nit: When encountering 'not ok', vms often has the 'not' on a line + # by itself: + # not + # ok 1 - 'I hate VMS' + if ( defined($line) and $line =~ /^\s*not\s*$/ ) { + $line .= ( $self->next_raw || '' ); + } + + return $line; +} + +sub next_raw { + require Carp; + my $msg = Carp::longmess('abstract method called directly!'); + $_[0]->_croak($msg); +} + +=head3 C + +If necessary switch the input stream to handle unicode. This only has +any effect for I/O handle based streams. + +The default implementation does nothing. + +=cut + +sub handle_unicode { } + +=head3 C + +Return a list of filehandles that may be used upstream in a select() +call to signal that this Iterator is ready. Iterators that are not +handle-based should return an empty list. + +The default implementation does nothing. + +=cut + +sub get_select_handles { + return; +} + +=head3 C + +B this method is abstract and should be overridden. + + my $wait_status = $iter->wait; + +Return the C status for this iterator. + +=head3 C + +B this method is abstract and should be overridden. + + my $wait_status = $iter->exit; + +Return the C status for this iterator. + +=cut + +sub wait { + require Carp; + my $msg = Carp::longmess('abstract method called directly!'); + $_[0]->_croak($msg); +} + +sub exit { + require Carp; + my $msg = Carp::longmess('abstract method called directly!'); + $_[0]->_croak($msg); +} + +1; + +=head1 SUBCLASSING + +Please see L for a subclassing overview. + +You must override the abstract methods as noted above. + +=head2 Example + +L is probably the easiest example to follow. +There's not much point repeating it here. + +=head1 SEE ALSO + +L, +L, +L, +L, +L, +L, + +=cut + -- cgit v1.2.3