.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
.\}
.\" ========================================================================
.\"
.IX Title "TAP::Parser::SourceHandler 3"
.TH TAP::Parser::SourceHandler 3 "2018-03-19" "perl v5.10.1" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
TAP::Parser::SourceHandler \- Base class for different TAP source handlers
.SH "VERSION"
.IX Header "VERSION"
Version 3.42
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 2
\& # abstract class \- don\*(Aqt use directly!
\& # see TAP::Parser::IteratorFactory for general usage
\&
\& # must be sub\-classed for use
\& package MySourceHandler;
\& use base \*(AqTAP::Parser::SourceHandler\*(Aq;
\& sub can_handle { return $confidence_level }
\& sub make_iterator { return $iterator }
\&
\& # see example below for more details
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
This is an abstract base class for TAP::Parser::Source handlers / handlers.
.PP
A \f(CW\*(C`TAP::Parser::SourceHandler\*(C'\fR does whatever is necessary to produce & capture
a stream of \s-1TAP\s0 from the \fIraw\fR source, and package it up in a
TAP::Parser::Iterator for the parser to consume.
.PP
\&\f(CW\*(C`SourceHandlers\*(C'\fR must implement the \fIsource detection & handling\fR interface
used by TAP::Parser::IteratorFactory. At 2 methods, the interface is pretty
simple: \*(L"can_handle\*(R" and \*(L"make_source\*(R".
.PP
Unless you're writing a new TAP::Parser::SourceHandler, a plugin, or
subclassing TAP::Parser, you probably won't need to use this module directly.
.SH "METHODS"
.IX Header "METHODS"
.SS "Class Methods"
.IX Subsection "Class Methods"
\fI\f(CI\*(C`can_handle\*(C'\fI\fR
.IX Subsection "can_handle"
.PP
\&\fIAbstract method\fR.
.PP
.Vb 1
\& my $vote = $class\->can_handle( $source );
.Ve
.PP
\&\f(CW$source\fR is a TAP::Parser::Source.
.PP
Returns a number between \f(CW0\fR & \f(CW1\fR reflecting how confidently the raw source
can be handled. For example, \f(CW0\fR means the source cannot handle it, \f(CW0.5\fR
means it may be able to, and \f(CW1\fR means it definitely can. See
\&\*(L"detect_source\*(R" in TAP::Parser::IteratorFactory for details on how this is used.
.PP
\fI\f(CI\*(C`make_iterator\*(C'\fI\fR
.IX Subsection "make_iterator"
.PP
\&\fIAbstract method\fR.
.PP
.Vb 1
\& my $iterator = $class\->make_iterator( $source );
.Ve
.PP
\&\f(CW$source\fR is a TAP::Parser::Source.
.PP
Returns a new TAP::Parser::Iterator object for use by the TAP::Parser.
\&\f(CW\*(C`croak\*(C'\fRs on error.
.SH "SUBCLASSING"
.IX Header "SUBCLASSING"
Please see \*(L"\s-1SUBCLASSING\s0\*(R" in TAP::Parser for a subclassing overview, and any
of the subclasses that ship with this module as an example. What follows is
a quick overview.
.PP
Start by familiarizing yourself with TAP::Parser::Source and
TAP::Parser::IteratorFactory. TAP::Parser::SourceHandler::RawTAP is
the easiest sub-class to use as an example.
.PP
It's important to point out that if you want your subclass to be automatically
used by TAP::Parser you'll have to and make sure it gets loaded somehow.
If you're using prove you can write an App::Prove plugin. If you're
using TAP::Parser or TAP::Harness directly (e.g. through a custom script,
ExtUtils::MakeMaker, or Module::Build) you can use the \f(CW\*(C`config\*(C'\fR option
which will cause \*(L"load_sources\*(R" in TAP::Parser::IteratorFactory to load your
subclass).
.PP
Don't forget to register your class with
\&\*(L"register_handler\*(R" in TAP::Parser::IteratorFactory.
.SS "Example"
.IX Subsection "Example"
.Vb 1
\& package MySourceHandler;
\&
\& use strict;
\&
\& use MySourceHandler; # see TAP::Parser::SourceHandler
\& use TAP::Parser::IteratorFactory;
\&
\& use base \*(AqTAP::Parser::SourceHandler\*(Aq;
\&
\& TAP::Parser::IteratorFactory\->register_handler( _\|_PACKAGE_\|_ );
\&
\& sub can_handle {
\& my ( $class, $src ) = @_;
\& my $meta = $src\->meta;
\& my $config = $src\->config_for( $class );
\&
\& if ($config\->{accept_all}) {
\& return 1.0;
\& } elsif (my $file = $meta\->{file}) {
\& return 0.0 unless $file\->{exists};
\& return 1.0 if $file\->{lc_ext} eq \*(Aq.tap\*(Aq;
\& return 0.9 if $file\->{shebang} && $file\->{shebang} =~ /^#!.+tap/;
\& return 0.5 if $file\->{text};
\& return 0.1 if $file\->{binary};
\& } elsif ($meta\->{scalar}) {
\& return 0.8 if $$raw_source_ref =~ /\ed\e.\e.\ed/;
\& return 0.6 if $meta\->{has_newlines};
\& } elsif ($meta\->{array}) {
\& return 0.8 if $meta\->{size} < 5;
\& return 0.6 if $raw_source_ref\->[0] =~ /foo/;
\& return 0.5;
\& } elsif ($meta\->{hash}) {
\& return 0.6 if $raw_source_ref\->{foo};
\& return 0.2;
\& }
\&
\& return 0;
\& }
\&
\& sub make_iterator {
\& my ($class, $source) = @_;
\& # this is where you manipulate the source and
\& # capture the stream of TAP in an iterator
\& # either pick a TAP::Parser::Iterator::* or write your own...
\& my $iterator = TAP::Parser::Iterator::Array\->new([ \*(Aqfoo\*(Aq, \*(Aqbar\*(Aq ]);
\& return $iterator;
\& }
\&
\& 1;
.Ve
.SH "AUTHORS"
.IX Header "AUTHORS"
TAPx Developers.
.PP
Source detection stuff added by Steve Purkis
.SH "SEE ALSO"
.IX Header "SEE ALSO"
TAP::Object,
TAP::Parser,
TAP::Parser::Source,
TAP::Parser::Iterator,
TAP::Parser::IteratorFactory,
TAP::Parser::SourceHandler::Executable,
TAP::Parser::SourceHandler::Perl,
TAP::Parser::SourceHandler::File,
TAP::Parser::SourceHandler::Handle,
TAP::Parser::SourceHandler::RawTAP
Copyright 2K16 - 2K18 Indonesian Hacker Rulez