summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/Pod::Simple::Subclassing.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Pod::Simple::Subclassing.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/Pod::Simple::Subclassing.3pm1212
1 files changed, 1212 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Pod::Simple::Subclassing.3pm b/upstream/mageia-cauldron/man3pm/Pod::Simple::Subclassing.3pm
new file mode 100644
index 00000000..2e6180c9
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/Pod::Simple::Subclassing.3pm
@@ -0,0 +1,1212 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" 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
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'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 >0, 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.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Pod::Simple::Subclassing 3pm"
+.TH Pod::Simple::Subclassing 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" 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
+Pod::Simple::Subclassing \-\- write a formatter as a Pod::Simple subclass
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 5
+\& package Pod::SomeFormatter;
+\& use Pod::Simple;
+\& @ISA = qw(Pod::Simple);
+\& $VERSION = \*(Aq1.01\*(Aq;
+\& use strict;
+\&
+\& sub _handle_element_start {
+\& my($parser, $element_name, $attr_hash_r) = @_;
+\& ...
+\& }
+\&
+\& sub _handle_element_end {
+\& my($parser, $element_name, $attr_hash_r) = @_;
+\& # NOTE: $attr_hash_r is only present when $element_name is "over" or "begin"
+\& # The remaining code excerpts will mostly ignore this $attr_hash_r, as it is
+\& # mostly useless. It is documented where "over\-*" and "begin" events are
+\& # documented.
+\& ...
+\& }
+\&
+\& sub _handle_text {
+\& my($parser, $text) = @_;
+\& ...
+\& }
+\& 1;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+This document is about using Pod::Simple to write a Pod processor,
+generally a Pod formatter. If you just want to know about using an
+existing Pod formatter, instead see its documentation and see also the
+docs in Pod::Simple.
+.PP
+\&\fBThe zeroeth step\fR in writing a Pod formatter is to make sure that there
+isn't already a decent one in CPAN. See <http://search.cpan.org/>, and
+run a search on the name of the format you want to render to. Also
+consider joining the Pod People list
+<http://lists.perl.org/showlist.cgi?name=pod\-people> and asking whether
+anyone has a formatter for that format \-\- maybe someone cobbled one
+together but just hasn't released it.
+.PP
+\&\fBThe first step\fR in writing a Pod processor is to read perlpodspec,
+which contains information on writing a Pod parser (which has been
+largely taken care of by Pod::Simple), but also a lot of requirements
+and recommendations for writing a formatter.
+.PP
+\&\fBThe second step\fR is to actually learn the format you're planning to
+format to \-\- or at least as much as you need to know to represent Pod,
+which probably isn't much.
+.PP
+\&\fBThe third step\fR is to pick which of Pod::Simple's interfaces you want to
+use:
+.IP Pod::Simple 4
+.IX Item "Pod::Simple"
+The basic Pod::Simple interface that uses \f(CW_handle_element_start()\fR,
+\&\f(CW_handle_element_end()\fR and \f(CW_handle_text()\fR.
+.IP Pod::Simple::Methody 4
+.IX Item "Pod::Simple::Methody"
+The Pod::Simple::Methody interface is event-based, similar to that of
+HTML::Parser or XML::Parser's "Handlers".
+.IP Pod::Simple::PullParser 4
+.IX Item "Pod::Simple::PullParser"
+Pod::Simple::PullParser provides a token-stream interface, sort of
+like HTML::TokeParser's interface.
+.IP Pod::Simple::SimpleTree 4
+.IX Item "Pod::Simple::SimpleTree"
+Pod::Simple::SimpleTree provides a simple tree interface, rather like
+XML::Parser's "Tree" interface. Users familiar with XML handling will
+be comfortable with this interface. Users interested in outputting XML,
+should look into the modules that produce an XML representation of the
+Pod stream, notably Pod::Simple::XMLOutStream; you can feed the output
+of such a class to whatever XML parsing system you are most at home with.
+.PP
+\&\fBThe last step\fR is to write your code based on how the events (or tokens,
+or tree-nodes, or the XML, or however you're parsing) will map to
+constructs in the output format. Also be sure to consider how to escape
+text nodes containing arbitrary text, and what to do with text
+nodes that represent preformatted text (from verbatim sections).
+.SH Events
+.IX Header "Events"
+TODO intro... mention that events are supplied for implicits, like for
+missing >'s
+.PP
+In the following section, we use XML to represent the event structure
+associated with a particular construct. That is, an opening tag
+represents the element start, the attributes of that opening tag are
+the attributes given to the callback, and the closing tag represents
+the end element.
+.PP
+Three callback methods must be supplied by a class extending
+Pod::Simple to receive the corresponding event:
+.ie n .IP """$parser\->_handle_element_start( \fIelement_name\fR, \fIattr_hashref\fR )""" 4
+.el .IP "\f(CW$parser\->_handle_element_start( \fR\f(CIelement_name\fR\f(CW, \fR\f(CIattr_hashref\fR\f(CW )\fR" 4
+.IX Item "$parser->_handle_element_start( element_name, attr_hashref )"
+.PD 0
+.ie n .IP """$parser\->_handle_element_end( \fIelement_name\fR )""" 4
+.el .IP "\f(CW$parser\->_handle_element_end( \fR\f(CIelement_name\fR\f(CW )\fR" 4
+.IX Item "$parser->_handle_element_end( element_name )"
+.ie n .IP """$parser\->_handle_text( \fItext_string\fR )""" 4
+.el .IP "\f(CW$parser\->_handle_text( \fR\f(CItext_string\fR\f(CW )\fR" 4
+.IX Item "$parser->_handle_text( text_string )"
+.PD
+.PP
+Here's the comprehensive list of values you can expect as
+\&\fIelement_name\fR in your implementation of \f(CW\*(C`_handle_element_start\*(C'\fR
+and \f(CW\*(C`_handle_element_end\*(C'\fR::
+.IP "events with an element_name of Document" 4
+.IX Item "events with an element_name of Document"
+Parsing a document produces this event structure:
+.Sp
+.Vb 3
+\& <Document start_line="543">
+\& ...all events...
+\& </Document>
+.Ve
+.Sp
+The value of the \fIstart_line\fR attribute will be the line number of the first
+Pod directive in the document.
+.Sp
+If there is no Pod in the given document, then the
+event structure will be this:
+.Sp
+.Vb 2
+\& <Document contentless="1" start_line="543">
+\& </Document>
+.Ve
+.Sp
+In that case, the value of the \fIstart_line\fR attribute will not be meaningful;
+under current implementations, it will probably be the line number of the
+last line in the file.
+.IP "events with an element_name of Para" 4
+.IX Item "events with an element_name of Para"
+Parsing a plain (non-verbatim, non-directive, non-data) paragraph in
+a Pod document produces this event structure:
+.Sp
+.Vb 3
+\& <Para start_line="543">
+\& ...all events in this paragraph...
+\& </Para>
+.Ve
+.Sp
+The value of the \fIstart_line\fR attribute will be the line number of the start
+of the paragraph.
+.Sp
+For example, parsing this paragraph of Pod:
+.Sp
+.Vb 2
+\& The value of the I<start_line> attribute will be the
+\& line number of the start of the paragraph.
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 8
+\& <Para start_line="129">
+\& The value of the
+\& <I>
+\& start_line
+\& </I>
+\& attribute will be the line number of the first Pod directive
+\& in the document.
+\& </Para>
+.Ve
+.IP "events with an element_name of B, C, F, or I." 4
+.IX Item "events with an element_name of B, C, F, or I."
+Parsing a B<...> formatting code (or of course any of its
+semantically identical syntactic variants
+B<<\ ...\ >>,
+or B<<<<\ ...\ >>>>, etc.)
+produces this event structure:
+.Sp
+.Vb 3
+\& <B>
+\& ...stuff...
+\& </B>
+.Ve
+.Sp
+Currently, there are no attributes conveyed.
+.Sp
+Parsing C, F, or I codes produce the same structure, with only a
+different element name.
+.Sp
+If your parser object has been set to accept other formatting codes,
+then they will be presented like these B/C/F/I codes \-\- i.e., without
+any attributes.
+.IP "events with an element_name of S" 4
+.IX Item "events with an element_name of S"
+Normally, parsing an S<...> sequence produces this event
+structure, just as if it were a B/C/F/I code:
+.Sp
+.Vb 3
+\& <S>
+\& ...stuff...
+\& </S>
+.Ve
+.Sp
+However, Pod::Simple (and presumably all derived parsers) offers the
+\&\f(CW\*(C`nbsp_for_S\*(C'\fR option which, if enabled, will suppress all S events, and
+instead change all spaces in the content to non-breaking spaces. This is
+intended for formatters that output to a format that has no code that
+means the same as S<...>, but which has a code/character that
+means non-breaking space.
+.IP "events with an element_name of X" 4
+.IX Item "events with an element_name of X"
+Normally, parsing an X<...> sequence produces this event
+structure, just as if it were a B/C/F/I code:
+.Sp
+.Vb 3
+\& <X>
+\& ...stuff...
+\& </X>
+.Ve
+.Sp
+However, Pod::Simple (and presumably all derived parsers) offers the
+\&\f(CW\*(C`nix_X_codes\*(C'\fR option which, if enabled, will suppress all X events
+and ignore their content. For formatters/processors that don't use
+X events, this is presumably quite useful.
+.IP "events with an element_name of L" 4
+.IX Item "events with an element_name of L"
+Because the L<...> is the most complex construct in the
+language, it should not surprise you that the events it generates are
+the most complex in the language. Most of complexity is hidden away in
+the attribute values, so for those of you writing a Pod formatter that
+produces a non-hypertextual format, you can just ignore the attributes
+and treat an L event structure like a formatting element that
+(presumably) doesn't actually produce a change in formatting. That is,
+the content of the L event structure (as opposed to its
+attributes) is always what text should be displayed.
+.Sp
+There are, at first glance, three kinds of L links: URL, man, and pod.
+.Sp
+When a L<\fIsome_url\fR> code is parsed, it produces this event
+structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="that_url" to="that_url" type="url">
+\& that_url
+\& </L>
+.Ve
+.Sp
+The \f(CW\*(C`type="url"\*(C'\fR attribute is always specified for this type of
+L code.
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& L<http://www.perl.com/CPAN/authors/>
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="http://www.perl.com/CPAN/authors/" to="http://www.perl.com/CPAN/authors/" type="url">
+\& http://www.perl.com/CPAN/authors/
+\& </L>
+.Ve
+.Sp
+When a L<\fImanpage(section)\fR> code is parsed (and these are
+fairly rare and not terribly useful), it produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="manpage(section)" to="manpage(section)" type="man">
+\& manpage(section)
+\& </L>
+.Ve
+.Sp
+The \f(CW\*(C`type="man"\*(C'\fR attribute is always specified for this type of
+L code.
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& L<crontab(5)>
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="crontab(5)" to="crontab(5)" type="man">
+\& crontab(5)
+\& </L>
+.Ve
+.Sp
+In the rare cases where a man page link has a section specified, that text appears
+in a \fIsection\fR attribute. For example, this Pod source:
+.Sp
+.Vb 1
+\& L<crontab(5)/"ENVIRONMENT">
+.Ve
+.Sp
+will produce this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="crontab(5)/&quot;ENVIRONMENT&quot;" section="ENVIRONMENT" to="crontab(5)" type="man">
+\& "ENVIRONMENT" in crontab(5)
+\& </L>
+.Ve
+.Sp
+In the rare case where the Pod document has code like
+L<\fIsometext\fR|\fImanpage(section)\fR>, then the \fIsometext\fR will appear
+as the content of the element, the \fImanpage(section)\fR text will appear
+only as the value of the \fIto\fR attribute, and there will be no
+\&\f(CW\*(C`content\-implicit="yes"\*(C'\fR attribute (whose presence means that the Pod parser
+had to infer what text should appear as the link text \-\- as opposed to
+cases where that attribute is absent, which means that the Pod parser did
+\&\fInot\fR have to infer the link text, because that L code explicitly specified
+some link text.)
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& L<hell itself!|crontab(5)>
+.Ve
+.Sp
+will produce this event structure:
+.Sp
+.Vb 3
+\& <L raw="hell itself!|crontab(5)" to="crontab(5)" type="man">
+\& hell itself!
+\& </L>
+.Ve
+.Sp
+The last type of L structure is for links to/within Pod documents. It is
+the most complex because it can have a \fIto\fR attribute, \fIor\fR a
+\&\fIsection\fR attribute, or both. The \f(CW\*(C`type="pod"\*(C'\fR attribute is always
+specified for this type of L code.
+.Sp
+In the most common case, the simple case of a L<podpage> code
+produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="podpage" to="podpage" type="pod">
+\& podpage
+\& </L>
+.Ve
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& L<Net::Ping>
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="Net::Ping" to="Net::Ping" type="pod">
+\& Net::Ping
+\& </L>
+.Ve
+.Sp
+In cases where there is link-text explicitly specified, it
+is to be found in the content of the element (and not the
+attributes), just as with the L<\fIsometext\fR|\fImanpage(section)\fR>
+case discussed above. For example, this Pod source:
+.Sp
+.Vb 1
+\& L<Perl Error Messages|perldiag>
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L raw="Perl Error Messages|perldiag" to="perldiag" type="pod">
+\& Perl Error Messages
+\& </L>
+.Ve
+.Sp
+In cases of links to a section in the current Pod document,
+there is a \fIsection\fR attribute instead of a \fIto\fR attribute.
+For example, this Pod source:
+.Sp
+.Vb 1
+\& L</"Member Data">
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="/&quot;Member Data&quot;" section="Member Data" type="pod">
+\& "Member Data"
+\& </L>
+.Ve
+.Sp
+As another example, this Pod source:
+.Sp
+.Vb 1
+\& L<the various attributes|/"Member Data">
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L raw="the various attributes|/&quot;Member Data&quot;" section="Member Data" type="pod">
+\& the various attributes
+\& </L>
+.Ve
+.Sp
+In cases of links to a section in a different Pod document,
+there are both a \fIsection\fR attribute and a to attribute.
+For example, this Pod source:
+.Sp
+.Vb 1
+\& L<perlsyn/"Basic BLOCKs and Switch Statements">
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="perlsyn/&quot;Basic BLOCKs and Switch Statements&quot;" section="Basic BLOCKs and Switch Statements" to="perlsyn" type="pod">
+\& "Basic BLOCKs and Switch Statements" in perlsyn
+\& </L>
+.Ve
+.Sp
+As another example, this Pod source:
+.Sp
+.Vb 1
+\& L<SWITCH statements|perlsyn/"Basic BLOCKs and Switch Statements">
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 3
+\& <L raw="SWITCH statements|perlsyn/&quot;Basic BLOCKs and Switch Statements&quot;" section="Basic BLOCKs and Switch Statements" to="perlsyn" type="pod">
+\& SWITCH statements
+\& </L>
+.Ve
+.Sp
+Incidentally, note that we do not distinguish between these syntaxes:
+.Sp
+.Vb 4
+\& L</"Member Data">
+\& L<"Member Data">
+\& L</Member Data>
+\& L<Member Data> [deprecated syntax]
+.Ve
+.Sp
+That is, they all produce the same event structure (for the most part), namely:
+.Sp
+.Vb 3
+\& <L content\-implicit="yes" raw="$depends_on_syntax" section="Member Data" type="pod">
+\& &#34;Member Data&#34;
+\& </L>
+.Ve
+.Sp
+The \fIraw\fR attribute depends on what the raw content of the \f(CW\*(C`L<>\*(C'\fR is,
+so that is why the event structure is the same "for the most part".
+.Sp
+If you have not guessed it yet, the \fIraw\fR attribute contains the raw,
+original, unescaped content of the \f(CW\*(C`L<>\*(C'\fR formatting code. In addition
+to the examples above, take notice of the following event structure produced
+by the following \f(CW\*(C`L<>\*(C'\fR formatting code.
+.Sp
+.Vb 1
+\& L<click B<here>|page/About the C<\-M> switch>
+\&
+\& <L raw="click B<here>|page/About the C<\-M> switch" section="About the \-M switch" to="page" type="pod">
+\& click B<here>
+\& </L>
+.Ve
+.Sp
+Specifically, notice that the formatting codes are present and unescaped
+in \fIraw\fR.
+.Sp
+There is a known bug in the \fIraw\fR attribute where any surrounding whitespace
+is condensed into a single ' '. For example, given L< link>, \fIraw\fR
+will be " link".
+.IP "events with an element_name of E or Z" 4
+.IX Item "events with an element_name of E or Z"
+While there are Pod codes E<...> and Z<>, these
+\&\fIdo not\fR produce any E or Z events \-\- that is, there are no such
+events as E or Z.
+.IP "events with an element_name of Verbatim" 4
+.IX Item "events with an element_name of Verbatim"
+When a Pod verbatim paragraph (AKA "codeblock") is parsed, it
+produces this event structure:
+.Sp
+.Vb 3
+\& <Verbatim start_line="543" xml:space="preserve">
+\& ...text...
+\& </Verbatim>
+.Ve
+.Sp
+The value of the \fIstart_line\fR attribute will be the line number of the
+first line of this verbatim block. The \fIxml:space\fR attribute is always
+present, and always has the value "preserve".
+.Sp
+The text content will have tabs already expanded.
+.IP "events with an element_name of head1 .. head4" 4
+.IX Item "events with an element_name of head1 .. head4"
+When a "=head1 ..." directive is parsed, it produces this event
+structure:
+.Sp
+.Vb 3
+\& <head1>
+\& ...stuff...
+\& </head1>
+.Ve
+.Sp
+For example, a directive consisting of this:
+.Sp
+.Vb 1
+\& =head1 Options to C<new> et al.
+.Ve
+.Sp
+will produce this event structure:
+.Sp
+.Vb 7
+\& <head1 start_line="543">
+\& Options to
+\& <C>
+\& new
+\& </C>
+\& et al.
+\& </head1>
+.Ve
+.Sp
+"=head2" through "=head4" directives are the same, except for the element
+names in the event structure.
+.IP "events with an element_name of encoding" 4
+.IX Item "events with an element_name of encoding"
+In the default case, the events corresponding to \f(CW\*(C`=encoding\*(C'\fR directives
+are not emitted. They are emitted if \f(CW\*(C`keep_encoding_directive\*(C'\fR is true.
+In that case they produce event structures like
+"events with an element_name of head1 .. head4" above.
+.IP "events with an element_name of over-bullet" 4
+.IX Item "events with an element_name of over-bullet"
+When an "=over ... =back" block is parsed where the items are
+a bulleted list, it will produce this event structure:
+.Sp
+.Vb 6
+\& <over\-bullet indent="4" start_line="543">
+\& <item\-bullet start_line="545">
+\& ...Stuff...
+\& </item\-bullet>
+\& ...more item\-bullets...
+\& </over\-bullet fake\-closer="1">
+.Ve
+.Sp
+The attribute \fIfake-closer\fR is only present if it is a true value; it is not
+present if it is a false value. It is shown in the above example to illustrate
+where the attribute is (in the \fBclosing\fR tag). It signifies that the \f(CW\*(C`=over\*(C'\fR
+did not have a matching \f(CW\*(C`=back\*(C'\fR, and thus Pod::Simple had to create a fake
+closer.
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& =over
+\&
+\& =item *
+\&
+\& Something
+\&
+\& =back
+.Ve
+.Sp
+Would produce an event structure that does \fBnot\fR have the \fIfake-closer\fR
+attribute, whereas this Pod source:
+.Sp
+.Vb 1
+\& =over
+\&
+\& =item *
+\&
+\& Gasp! An unclosed =over block!
+.Ve
+.Sp
+would. The rest of the over\-* examples will not demonstrate this attribute,
+but they all can have it. See Pod::Checker's source for an example of this
+attribute being used.
+.Sp
+The value of the \fIindent\fR attribute is whatever value is after the
+"=over" directive, as in "=over 8". If no such value is specified
+in the directive, then the \fIindent\fR attribute has the value "4".
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& =over
+\&
+\& =item *
+\&
+\& Stuff
+\&
+\& =item *
+\&
+\& Bar I<baz>!
+\&
+\& =back
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 8
+\& <over\-bullet indent="4" start_line="10">
+\& <item\-bullet start_line="12">
+\& Stuff
+\& </item\-bullet>
+\& <item\-bullet start_line="14">
+\& Bar <I>baz</I>!
+\& </item\-bullet>
+\& </over\-bullet>
+.Ve
+.IP "events with an element_name of over-number" 4
+.IX Item "events with an element_name of over-number"
+When an "=over ... =back" block is parsed where the items are
+a numbered list, it will produce this event structure:
+.Sp
+.Vb 6
+\& <over\-number indent="4" start_line="543">
+\& <item\-number number="1" start_line="545">
+\& ...Stuff...
+\& </item\-number>
+\& ...more item\-number...
+\& </over\-bullet>
+.Ve
+.Sp
+This is like the "over-bullet" event structure; but note that the contents
+are "item-number" instead of "item-bullet", and note that they will have
+a "number" attribute, which some formatters/processors may ignore
+(since, for example, there's no need for it in HTML when producing
+an "<UL><LI>...</LI>...</UL>" structure), but which any processor may use.
+.Sp
+Note that the values for the \fInumber\fR attributes of "item-number"
+elements in a given "over-number" area \fIwill\fR start at 1 and go up by
+one each time. If the Pod source doesn't follow that order (even though
+it really should!), whatever numbers it has will be ignored (with
+the correct values being put in the \fInumber\fR attributes), and an error
+message might be issued to the user.
+.IP "events with an element_name of over-text" 4
+.IX Item "events with an element_name of over-text"
+These events are somewhat unlike the other over\-*
+structures, as far as what their contents are. When
+an "=over ... =back" block is parsed where the items are
+a list of text "subheadings", it will produce this event structure:
+.Sp
+.Vb 8
+\& <over\-text indent="4" start_line="543">
+\& <item\-text>
+\& ...stuff...
+\& </item\-text>
+\& ...stuff (generally Para or Verbatim elements)...
+\& <item\-text>
+\& ...more item\-text and/or stuff...
+\& </over\-text>
+.Ve
+.Sp
+The \fIindent\fR and \fIfake-closer\fR attributes are as with the other over\-* events.
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& =over
+\&
+\& =item Foo
+\&
+\& Stuff
+\&
+\& =item Bar I<baz>!
+\&
+\& Quux
+\&
+\& =back
+.Ve
+.Sp
+produces this event structure:
+.Sp
+.Vb 10
+\& <over\-text indent="4" start_line="20">
+\& <item\-text start_line="22">
+\& Foo
+\& </item\-text>
+\& <Para start_line="24">
+\& Stuff
+\& </Para>
+\& <item\-text start_line="26">
+\& Bar
+\& <I>
+\& baz
+\& </I>
+\& !
+\& </item\-text>
+\& <Para start_line="28">
+\& Quux
+\& </Para>
+\& </over\-text>
+.Ve
+.IP "events with an element_name of over-block" 4
+.IX Item "events with an element_name of over-block"
+These events are somewhat unlike the other over\-*
+structures, as far as what their contents are. When
+an "=over ... =back" block is parsed where there are no items,
+it will produce this event structure:
+.Sp
+.Vb 3
+\& <over\-block indent="4" start_line="543">
+\& ...stuff (generally Para or Verbatim elements)...
+\& </over\-block>
+.Ve
+.Sp
+The \fIindent\fR and \fIfake-closer\fR attributes are as with the other over\-* events.
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& =over
+\&
+\& For cutting off our trade with all parts of the world
+\&
+\& For transporting us beyond seas to be tried for pretended offenses
+\&
+\& He is at this time transporting large armies of foreign mercenaries to
+\& complete the works of death, desolation and tyranny, already begun with
+\& circumstances of cruelty and perfidy scarcely paralleled in the most
+\& barbarous ages, and totally unworthy the head of a civilized nation.
+\&
+\& =back
+.Ve
+.Sp
+will produce this event structure:
+.Sp
+.Vb 11
+\& <over\-block indent="4" start_line="2">
+\& <Para start_line="4">
+\& For cutting off our trade with all parts of the world
+\& </Para>
+\& <Para start_line="6">
+\& For transporting us beyond seas to be tried for pretended offenses
+\& </Para>
+\& <Para start_line="8">
+\& He is at this time transporting large armies of [...more text...]
+\& </Para>
+\& </over\-block>
+.Ve
+.IP "events with an element_name of over-empty" 4
+.IX Item "events with an element_name of over-empty"
+\&\fBNote: These events are only triggered if \fR\f(CBparse_empty_lists()\fR\fB is set to a
+true value.\fR
+.Sp
+These events are somewhat unlike the other over\-* structures, as far as what
+their contents are. When an "=over ... =back" block is parsed where there
+is no content, it will produce this event structure:
+.Sp
+.Vb 2
+\& <over\-empty indent="4" start_line="543">
+\& </over\-empty>
+.Ve
+.Sp
+The \fIindent\fR and \fIfake-closer\fR attributes are as with the other over\-* events.
+.Sp
+For example, this Pod source:
+.Sp
+.Vb 1
+\& =over
+\&
+\& =over
+\&
+\& =back
+\&
+\& =back
+.Ve
+.Sp
+will produce this event structure:
+.Sp
+.Vb 4
+\& <over\-block indent="4" start_line="1">
+\& <over\-empty indent="4" start_line="3">
+\& </over\-empty>
+\& </over\-block>
+.Ve
+.Sp
+Note that the outer \f(CW\*(C`=over\*(C'\fR is a block because it has no \f(CW\*(C`=item\*(C'\fRs but still
+has content: the inner \f(CW\*(C`=over\*(C'\fR. The inner \f(CW\*(C`=over\*(C'\fR, in turn, is completely
+empty, and is treated as such.
+.IP "events with an element_name of item-bullet" 4
+.IX Item "events with an element_name of item-bullet"
+See "events with an element_name of over-bullet", above.
+.IP "events with an element_name of item-number" 4
+.IX Item "events with an element_name of item-number"
+See "events with an element_name of over-number", above.
+.IP "events with an element_name of item-text" 4
+.IX Item "events with an element_name of item-text"
+See "events with an element_name of over-text", above.
+.IP "events with an element_name of for" 4
+.IX Item "events with an element_name of for"
+TODO...
+.IP "events with an element_name of Data" 4
+.IX Item "events with an element_name of Data"
+TODO...
+.SH "More Pod::Simple Methods"
+.IX Header "More Pod::Simple Methods"
+Pod::Simple provides a lot of methods that aren't generally interesting
+to the end user of an existing Pod formatter, but some of which you
+might find useful in writing a Pod formatter. They are listed below. The
+first several methods (the accept_* methods) are for declaring the
+capabilities of your parser, notably what \f(CW\*(C`=for \fR\f(CItargetname\fR\f(CW\*(C'\fR sections
+it's interested in, what extra N<...> codes it accepts beyond
+the ones described in the \fIperlpod\fR.
+.ie n .IP """$parser\->accept_targets( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->accept_targets( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->accept_targets( SOMEVALUE )"
+As the parser sees sections like:
+.Sp
+.Vb 1
+\& =for html <img src="fig1.jpg">
+.Ve
+.Sp
+or
+.Sp
+.Vb 1
+\& =begin html
+\&
+\& <img src="fig1.jpg">
+\&
+\& =end html
+.Ve
+.Sp
+\&...the parser will ignore these sections unless your subclass has
+specified that it wants to see sections targeted to "html" (or whatever
+the formatter name is).
+.Sp
+If you want to process all sections, even if they're not targeted for you,
+call this before you start parsing:
+.Sp
+.Vb 1
+\& $parser\->accept_targets(\*(Aq*\*(Aq);
+.Ve
+.ie n .IP """$parser\->accept_targets_as_text( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->accept_targets_as_text( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->accept_targets_as_text( SOMEVALUE )"
+This is like accept_targets, except that it specifies also that the
+content of sections for this target should be treated as Pod text even
+if the target name in "=for \fItargetname\fR" doesn't start with a ":".
+.Sp
+At time of writing, I don't think you'll need to use this.
+.ie n .IP """$parser\->accept_codes( \fICodename\fR, \fICodename\fR... )""" 4
+.el .IP "\f(CW$parser\->accept_codes( \fR\f(CICodename\fR\f(CW, \fR\f(CICodename\fR\f(CW... )\fR" 4
+.IX Item "$parser->accept_codes( Codename, Codename... )"
+This tells the parser that you accept additional formatting codes,
+beyond just the standard ones (I B C L F S X, plus the two weird ones
+you don't actually see in the parse tree, Z and E). For example, to also
+accept codes "N", "R", and "W":
+.Sp
+.Vb 1
+\& $parser\->accept_codes( qw( N R W ) );
+.Ve
+.Sp
+\&\fBTODO: document how this interacts with =extend, and long element names\fR
+.ie n .IP """$parser\->accept_directive_as_data( \fIdirective_name\fR )""" 4
+.el .IP "\f(CW$parser\->accept_directive_as_data( \fR\f(CIdirective_name\fR\f(CW )\fR" 4
+.IX Item "$parser->accept_directive_as_data( directive_name )"
+.PD 0
+.ie n .IP """$parser\->accept_directive_as_verbatim( \fIdirective_name\fR )""" 4
+.el .IP "\f(CW$parser\->accept_directive_as_verbatim( \fR\f(CIdirective_name\fR\f(CW )\fR" 4
+.IX Item "$parser->accept_directive_as_verbatim( directive_name )"
+.ie n .IP """$parser\->accept_directive_as_processed( \fIdirective_name\fR )""" 4
+.el .IP "\f(CW$parser\->accept_directive_as_processed( \fR\f(CIdirective_name\fR\f(CW )\fR" 4
+.IX Item "$parser->accept_directive_as_processed( directive_name )"
+.PD
+In the unlikely situation that you need to tell the parser that you will
+accept additional directives ("=foo" things), you need to first set the
+parser to treat its content as data (i.e., not really processed at
+all), or as verbatim (mostly just expanding tabs), or as processed text
+(parsing formatting codes like B<...>).
+.Sp
+For example, to accept a new directive "=method", you'd presumably
+use:
+.Sp
+.Vb 1
+\& $parser\->accept_directive_as_processed("method");
+.Ve
+.Sp
+so that you could have Pod lines like:
+.Sp
+.Vb 1
+\& =method I<$whatever> thing B<um>
+.Ve
+.Sp
+Making up your own directives breaks compatibility with other Pod
+formatters, in a way that using "=for \fItarget\fR ..." lines doesn't;
+however, you may find this useful if you're making a Pod superset
+format where you don't need to worry about compatibility.
+.ie n .IP """$parser\->nbsp_for_S( \fIBOOLEAN\fR );""" 4
+.el .IP "\f(CW$parser\->nbsp_for_S( \fR\f(CIBOOLEAN\fR\f(CW );\fR" 4
+.IX Item "$parser->nbsp_for_S( BOOLEAN );"
+Setting this attribute to a true value (and by default it is false) will
+turn "S<...>" sequences into sequences of words separated by
+\&\f(CW\*(C`\exA0\*(C'\fR (non-breaking space) characters. For example, it will take this:
+.Sp
+.Vb 1
+\& I like S<Dutch apple pie>, don\*(Aqt you?
+.Ve
+.Sp
+and treat it as if it were:
+.Sp
+.Vb 1
+\& I like DutchE<nbsp>appleE<nbsp>pie, don\*(Aqt you?
+.Ve
+.Sp
+This is handy for output formats that don't have anything quite like an
+"S<...>" code, but which do have a code for non-breaking space.
+.Sp
+There is currently no method for going the other way; but I can
+probably provide one upon request.
+.ie n .IP """$parser\->version_report()""" 4
+.el .IP \f(CW$parser\->version_report()\fR 4
+.IX Item "$parser->version_report()"
+This returns a string reporting the \f(CW$VERSION\fR value from your module (and
+its classname) as well as the \f(CW$VERSION\fR value of Pod::Simple. Note that
+perlpodspec requires output formats (wherever possible) to note
+this detail in a comment in the output format. For example, for
+some kind of SGML output format:
+.Sp
+.Vb 1
+\& print OUT "<!\-\- \en", $parser\->version_report, "\en \-\->";
+.Ve
+.ie n .IP """$parser\->pod_para_count()""" 4
+.el .IP \f(CW$parser\->pod_para_count()\fR 4
+.IX Item "$parser->pod_para_count()"
+This returns the count of Pod paragraphs seen so far.
+.ie n .IP """$parser\->line_count()""" 4
+.el .IP \f(CW$parser\->line_count()\fR 4
+.IX Item "$parser->line_count()"
+This is the current line number being parsed. But you might find the
+"line_number" event attribute more accurate, when it is present.
+.ie n .IP """$parser\->nix_X_codes( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->nix_X_codes( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->nix_X_codes( SOMEVALUE )"
+This attribute, when set to a true value (and it is false by default)
+ignores any "X<...>" sequences in the document being parsed.
+Many formats don't actually use the content of these codes, so have
+no reason to process them.
+.ie n .IP """$parser\->keep_encoding_directive( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->keep_encoding_directive( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->keep_encoding_directive( SOMEVALUE )"
+This attribute, when set to a true value (it is false by default)
+will keep \f(CW\*(C`=encoding\*(C'\fR and its content in the event structure. Most
+formats don't actually need to process the content of an \f(CW\*(C`=encoding\*(C'\fR
+directive, even when this directive sets the encoding and the
+processor makes use of the encoding information. Indeed, it is
+possible to know the encoding without processing the directive
+content.
+.ie n .IP """$parser\->merge_text( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->merge_text( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->merge_text( SOMEVALUE )"
+This attribute, when set to a true value (and it is false by default)
+makes sure that only one event (or token, or node) will be created
+for any single contiguous sequence of text. For example, consider
+this somewhat contrived example:
+.Sp
+.Vb 1
+\& I just LOVE Z<>hotE<32>apple pie!
+.Ve
+.Sp
+When that is parsed and events are about to be called on it, it may
+actually seem to be four different text events, one right after another:
+one event for "I just LOVE ", one for "hot", one for " ", and one for
+"apple pie!". But if you have merge_text on, then you're guaranteed
+that it will be fired as one text event: "I just LOVE hot apple pie!".
+.ie n .IP """$parser\->code_handler( \fICODE_REF\fR )""" 4
+.el .IP "\f(CW$parser\->code_handler( \fR\f(CICODE_REF\fR\f(CW )\fR" 4
+.IX Item "$parser->code_handler( CODE_REF )"
+This specifies code that should be called when a code line is seen
+(i.e., a line outside of the Pod). Normally this is undef, meaning
+that no code should be called. If you provide a routine, it should
+start out like this:
+.Sp
+.Vb 4
+\& sub get_code_line { # or whatever you\*(Aqll call it
+\& my($line, $line_number, $parser) = @_;
+\& ...
+\& }
+.Ve
+.Sp
+Note, however, that sometimes the Pod events aren't processed in exactly
+the same order as the code lines are \-\- i.e., if you have a file with
+Pod, then code, then more Pod, sometimes the code will be processed (via
+whatever you have code_handler call) before the all of the preceding Pod
+has been processed.
+.ie n .IP """$parser\->cut_handler( \fICODE_REF\fR )""" 4
+.el .IP "\f(CW$parser\->cut_handler( \fR\f(CICODE_REF\fR\f(CW )\fR" 4
+.IX Item "$parser->cut_handler( CODE_REF )"
+This is just like the code_handler attribute, except that it's for
+"=cut" lines, not code lines. The same caveats apply. "=cut" lines are
+unlikely to be interesting, but this is included for completeness.
+.ie n .IP """$parser\->pod_handler( \fICODE_REF\fR )""" 4
+.el .IP "\f(CW$parser\->pod_handler( \fR\f(CICODE_REF\fR\f(CW )\fR" 4
+.IX Item "$parser->pod_handler( CODE_REF )"
+This is just like the code_handler attribute, except that it's for
+"=pod" lines, not code lines. The same caveats apply. "=pod" lines are
+unlikely to be interesting, but this is included for completeness.
+.ie n .IP """$parser\->whiteline_handler( \fICODE_REF\fR )""" 4
+.el .IP "\f(CW$parser\->whiteline_handler( \fR\f(CICODE_REF\fR\f(CW )\fR" 4
+.IX Item "$parser->whiteline_handler( CODE_REF )"
+This is just like the code_handler attribute, except that it's for
+lines that are seemingly blank but have whitespace (" " and/or "\et") on them,
+not code lines. The same caveats apply. These lines are unlikely to be
+interesting, but this is included for completeness.
+.ie n .IP """$parser\->whine( \fIlinenumber\fR, \fIcomplaint string\fR )""" 4
+.el .IP "\f(CW$parser\->whine( \fR\f(CIlinenumber\fR\f(CW, \fR\f(CIcomplaint string\fR\f(CW )\fR" 4
+.IX Item "$parser->whine( linenumber, complaint string )"
+This notes a problem in the Pod, which will be reported in the "Pod
+Errors" section of the document and/or sent to STDERR, depending on the
+values of the attributes \f(CW\*(C`no_whining\*(C'\fR, \f(CW\*(C`no_errata_section\*(C'\fR, and
+\&\f(CW\*(C`complain_stderr\*(C'\fR.
+.ie n .IP """$parser\->scream( \fIlinenumber\fR, \fIcomplaint string\fR )""" 4
+.el .IP "\f(CW$parser\->scream( \fR\f(CIlinenumber\fR\f(CW, \fR\f(CIcomplaint string\fR\f(CW )\fR" 4
+.IX Item "$parser->scream( linenumber, complaint string )"
+This notes an error like \f(CW\*(C`whine\*(C'\fR does, except that it is not
+suppressible with \f(CW\*(C`no_whining\*(C'\fR. This should be used only for very
+serious errors.
+.ie n .IP """$parser\->source_dead(1)""" 4
+.el .IP \f(CW$parser\->source_dead(1)\fR 4
+.IX Item "$parser->source_dead(1)"
+This aborts parsing of the current document, by switching on the flag
+that indicates that EOF has been seen. In particularly drastic cases,
+you might want to do this. It's rather nicer than just calling
+\&\f(CW\*(C`die\*(C'\fR!
+.ie n .IP """$parser\->hide_line_numbers( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->hide_line_numbers( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->hide_line_numbers( SOMEVALUE )"
+Some subclasses that indiscriminately dump event attributes (well,
+except for ones beginning with "~") can use this object attribute for
+refraining to dump the "start_line" attribute.
+.ie n .IP """$parser\->no_whining( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->no_whining( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->no_whining( SOMEVALUE )"
+This attribute, if set to true, will suppress reports of non-fatal
+error messages. The default value is false, meaning that complaints
+\&\fIare\fR reported. How they get reported depends on the values of
+the attributes \f(CW\*(C`no_errata_section\*(C'\fR and \f(CW\*(C`complain_stderr\*(C'\fR.
+.ie n .IP """$parser\->no_errata_section( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->no_errata_section( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->no_errata_section( SOMEVALUE )"
+This attribute, if set to true, will suppress generation of an errata
+section. The default value is false \-\- i.e., an errata section will be
+generated.
+.ie n .IP """$parser\->complain_stderr( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->complain_stderr( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->complain_stderr( SOMEVALUE )"
+This attribute, if set to true will send complaints to STDERR. The
+default value is false \-\- i.e., complaints do not go to STDERR.
+.ie n .IP """$parser\->bare_output( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->bare_output( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->bare_output( SOMEVALUE )"
+Some formatter subclasses use this as a flag for whether output should
+have prologue and epilogue code omitted. For example, setting this to
+true for an HTML formatter class should omit the
+"<html><head><title>...</title><body>..." prologue and the
+"</body></html>" epilogue.
+.Sp
+If you want to set this to true, you should probably also set
+\&\f(CW\*(C`no_whining\*(C'\fR or at least \f(CW\*(C`no_errata_section\*(C'\fR to true.
+.ie n .IP """$parser\->preserve_whitespace( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->preserve_whitespace( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->preserve_whitespace( SOMEVALUE )"
+If you set this attribute to a true value, the parser will try to
+preserve whitespace in the output. This means that such formatting
+conventions as two spaces after periods will be preserved by the parser.
+This is primarily useful for output formats that treat whitespace as
+significant (such as text or *roff, but not HTML).
+.ie n .IP """$parser\->parse_empty_lists( \fISOMEVALUE\fR )""" 4
+.el .IP "\f(CW$parser\->parse_empty_lists( \fR\f(CISOMEVALUE\fR\f(CW )\fR" 4
+.IX Item "$parser->parse_empty_lists( SOMEVALUE )"
+If this attribute is set to true, the parser will not ignore empty
+\&\f(CW\*(C`=over\*(C'\fR/\f(CW\*(C`=back\*(C'\fR blocks. The type of \f(CW\*(C`=over\*(C'\fR will be \fIempty\fR, documented
+above, "events with an element_name of over-empty".
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+Pod::Simple \-\- event-based Pod-parsing framework
+.PP
+Pod::Simple::Methody \-\- like Pod::Simple, but each sort of event
+calls its own method (like \f(CW\*(C`start_head3\*(C'\fR)
+.PP
+Pod::Simple::PullParser \-\- a Pod-parsing framework like Pod::Simple,
+but with a token-stream interface
+.PP
+Pod::Simple::SimpleTree \-\- a Pod-parsing framework like Pod::Simple,
+but with a tree interface
+.PP
+Pod::Simple::Checker \-\- a simple Pod::Simple subclass that reads
+documents, and then makes a plaintext report of any errors found in the
+document
+.PP
+Pod::Simple::DumpAsXML \-\- for dumping Pod documents as tidily
+indented XML, showing each event on its own line
+.PP
+Pod::Simple::XMLOutStream \-\- dumps a Pod document as XML (without
+introducing extra whitespace as Pod::Simple::DumpAsXML does).
+.PP
+Pod::Simple::DumpAsText \-\- for dumping Pod documents as tidily
+indented text, showing each event on its own line
+.PP
+Pod::Simple::LinkSection \-\- class for objects representing the values
+of the TODO and TODO attributes of L<...> elements
+.PP
+Pod::Escapes \-\- the module that Pod::Simple uses for evaluating
+E<...> content
+.PP
+Pod::Simple::Text \-\- a simple plaintext formatter for Pod
+.PP
+Pod::Simple::TextContent \-\- like Pod::Simple::Text, but
+makes no effort for indent or wrap the text being formatted
+.PP
+Pod::Simple::HTML \-\- a simple HTML formatter for Pod
+.PP
+perlpod
+.PP
+perlpodspec
+.PP
+perldoc
+.SH SUPPORT
+.IX Header "SUPPORT"
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod\-people@perl.org mail list. Send an empty email to
+pod\-people\-subscribe@perl.org to subscribe.
+.PP
+This module is managed in an open GitHub repository,
+<https://github.com/perl\-pod/pod\-simple/>. Feel free to fork and contribute, or
+to clone <git://github.com/perl\-pod/pod\-simple.git> and send patches!
+.PP
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug\-pod\-simple@rt.cpan.org>.
+.SH "COPYRIGHT AND DISCLAIMERS"
+.IX Header "COPYRIGHT AND DISCLAIMERS"
+Copyright (c) 2002 Sean M. Burke.
+.PP
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+.PP
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+.SH AUTHOR
+.IX Header "AUTHOR"
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+.PP
+Pod::Simple is maintained by:
+.IP \(bu 4
+Allison Randal \f(CW\*(C`allison@perl.org\*(C'\fR
+.IP \(bu 4
+Hans Dieter Pearcey \f(CW\*(C`hdp@cpan.org\*(C'\fR
+.IP \(bu 4
+David E. Wheeler \f(CW\*(C`dwheeler@cpan.org\*(C'\fR