Pod-Weaver

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

Revision history for Pod-Weaver

4.020     2024-03-21 13:58:33-04:00 America/New_York
        - do not allow Moose::Util::TypeConstraints to turn warnings back on
          after they were turned off by experimental.pm! (thanks, Karen
          Etheridge)

4.019     2023-01-11 21:59:08-05:00 America/New_York
        - update dist metadata
        - update a test to pass under Test2::Harness (even though I'm not sure
          why I had to!)

4.018     2021-06-19 10:55:10-04:00 America/New_York
        - update author contact info
        - use postfix dereferencing, since we already require v5.20.0
        - add perl support section to docs

4.017     2021-04-17 17:51:31-04:00 America/New_York
        - no changes from previous trial release

4.016     2021-04-06 22:22:59-04:00 America/New_York (TRIAL RELEASE)
        - GenerateSection by David Miguel Susano Pinto has been bundled with
          Pod::Weaver.  Although it has been fairly heavily edited, it should
          be entirely compatible with previous versions.  Thanks, David!

4.015     2016-10-14 20:48:13-04:00 America/New_York
        - fix bugs introduced in 4.014 that would cause [Bugs] and [Legal]
          to run even when they should've skipped

4.014     2016-09-18 22:25:51-04:00 America/New_York
        - make links in [Bugs] use L<> (thanks, David Zurborg!)
        - added debug level logging to the weaver, plugins, and
          section. GitHub #42.  (thanks, Dave Rolsky)

4.013     2016-04-24 23:19:14+01:00 Europe/London
        - use text for PPI, not octet

4.012     2015-05-05 21:01:33-04:00 America/New_York
        - avoid breaking up words when wrapping text in [Bugs]

4.011     2015-03-17 07:48:54-04:00 America/New_York
        - add "header" attributes to more sections, to change the =head1
          headert ext (thanks, David Wheeler)

4.010     2014-12-30 22:02:58-05:00 America/New_York
        - use of Moose::Autobox has been dropped (thanks Karen Etheridge!)

4.009     2014-12-02 23:00:37-05:00 America/New_York
        - when a Collect-worthy header exists (like =head1 METHODS) use it,
          rather than making a new one *and* leaving the old one around
          (thanks, Christian Walde)

4.008     2014-11-12 09:37:13-05:00 America/New_York
        - handle UTF-8 data in PODNAME and ABSTRACT (thanks,  Blabos de Blebe)
        - Explain Section::Region naming, nonpod, and flattening
          (thanks, Kent Fredric)

4.007     2014-10-27 22:21:55-04:00 America/New_York
        - immutabilize ALL THE THINGS!

4.006     2014-01-07 20:12:37-05:00 America/New_York
        - update tests to pass octets to ->read_string, as is proper

4.005     2013-12-21 15:01:46-0500 America/New_York
        - updated tests for the new (fixed, consistent) string behavior in
          Mixin::Linewise

4.004     2013-11-05 21:50:13 America/New_York
        - allow multi-line formats for VERSION plugin (thanks, Alex Peters)
        - ...including the %T-prefix for lines only included in
          trial releases
        - look for PODNAME more consistently (thanks, Chris Weyl)
        - put license filename in F<> formatting (thanks, Alex Peters)

4.003     2013-11-02 22:58:43 America/New_York
        - note that [@Default] contains [-SingleEncoding] (thanks, Caleb
          Cushing)

4.002     2013-11-02 11:37:04 America/New_York
        [ THIS MIGHT BREAK YOUR CODE ]
        - stable release of previous v4 changes

4.001     2013-10-20 10:50:50 America/New_York (TRIAL RELEASE)
        [ THIS MIGHT BREAK YOUR CODE ]
        - SingleEncoding now accepts found =encodings as long as they match,
          unless the plugin's encoding attribute was set explicitly

4.000     2013-10-19 17:20:59 America/New_York (TRIAL RELEASE)
        [ THIS MIGHT BREAK YOUR CODE ]
        - the SingleEncoding plugin to force one consistent =encoding
        - ...is now enabled, for UTF-8, in the default configuration

3.101640  2013-09-17 08:57:41 Asia/Tokyo
        - fix repository links! argh, oops

3.101639  2013-09-17 08:56:05 Asia/Tokyo
        - documentation fix: mention that =func exists in the default
          configuration (thanks, Joshua Keroes!)
        - removed use of deprecated Class::MOP::load_class (thanks, Karen
          Etheridge)

3.101638  2012-08-03 20:42:44 America/New_York
        - add more helpful information to the "no document name" error (thanks,
          Leto Labs, LLC!)

3.101637  2012-06-07 22:18:55 America/New_York
        - add header_command attribute to the Collect section
          (thanks, Christopher J. Madsen)

3.101636  2012-05-04 21:28:10 America/New_York
        - break the content-generating code in the Version section into its own
          method (thanks, Chris Weyl)

3.101635  2012-02-07 22:03:26 America/New_York
        - restore the full-document scan for ABSTRACT if not found in a comment
          token (thanks, David Golden)

3.101634  2011-10-31 22:56:36 America/New_York
        - throw a (helpful?) exception when %m is used in a version format, but
          no package was found in the file

        - the Legal plugin can now be given the filename in which the dist's
          full license can be found (thanks, APOCAL!)

3.101633  2011-09-19 15:48:16 America/New_York
        - speed up performance by changing how we use PPI (thanks, Dave Rolsky)

3.101632  2010-10-19 07:49:32 America/New_York
        - add missing DateTime prereq

3.101631  2010-10-14 23:00:19 America/New_York
        - Name section now looks for a PODNAME comment if no package is found
          (hanekomu)

        - Added a Bugs section (thanks, David Golden)

        - Version, Region, and Generic are all more configurable (thanks,
          Apocalypse)

3.101630  2010-06-12 14:42:26 America/New_York
        - Author section now emits a normal para or bulleted list (Florian
          Ragwitz)

3.101460  2010-05-26 22:36:13 America/New_York
        - compat with Config::MVP::Reader v2

3.101450  2010-05-25 18:38:44 America/New_York
        - compat with Config::MVP::Reader v1

3.101270  2010-05-07 21:36:45 America/New_York
        - allow an explicit header arg to Generic

3.100710  2010-03-12 10:03:42 America/New_York
        - further logging improvements; now uses Log::Dispatchouli explicitly

3.100680  2010-03-09 23:38:30 America/New_York
        - improve logging delegation to interoperate with recent DZ changes

3.100650  2010-03-06 23:21:19 America/New_York
        - expect a Log::Dispatchouli-like logger
        - added a means to tweak the configuration loaded during new
        - log the file in which errors occur more often

3.100310  2010-01-31 15:32:00 America/New_York
        - add =func/FUNCTIONS to match =method and =attr
        - require newer Pod::Elemental (to avoid Moose incompat)

3.093530  2009-12-19 22:52:47 America/New_York
        - add the -Transformer plugin to allow pass-through for arbitrary
          Pod::Elemental::Transformers

3.093130  2009-11-09
        - add Config::MVP::Reader::INI to prereq

3.093120  2009-11-08
        - fix broken prereq (Config::MVP)

3.093001  2009-10-27
        - create @Default and use it to set up the new_with_default_config

3.093000  2009-10-27
        - plugins for common preparation: -H1Nester, -EnsurePod5, @CorePrep
          "-" as prefix now denotes a non-Section plugin
        - tweak weaving phases and methods to add Dialect

3.092990  2009-10-26
        - Pod::Weaver::Config and tests for config-from-ini

3.092972  2009-10-24
        - no code changes; Pod robuilt

3.092971  2009-10-24
        - fixes to make the NAME section "just work"

3.092970  2009-10-24
        - total rewrite

1.003     2008-10-??
        - use $doc->serialize instead of "$doc" to work with here-docs

1.002     2008-10-13
        - add missing prereq (PPI)

1.001     2008-10-12
        - fix prereq for testing

1.000     2008-10-12
        - first release (at the Pittsburgh Perl Workshop)

LICENSE  view on Meta::CPAN

This software is copyright (c) 2024 by Ricardo SIGNES.

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

Terms of the Perl programming language system itself

a) the GNU General Public License as published by the Free
   Software Foundation; either version 1, or (at your option) any
   later version, or
b) the "Artistic License"

--- The GNU General Public License, Version 1, February 1989 ---

This software is Copyright (c) 2024 by Ricardo SIGNES.

This is free software, licensed under:

  The GNU General Public License, Version 1, February 1989

                    GNU GENERAL PUBLIC LICENSE
                     Version 1, February 1989

 Copyright (C) 1989 Free Software Foundation, Inc.
 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The license agreements of most software companies try to keep users
at the mercy of those companies.  By contrast, our General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  The
General Public License applies to the Free Software Foundation's
software and to any other program whose authors commit to using it.
You can use it for your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Specifically, the General Public License is designed to make
sure that you have the freedom to give away or sell copies of free
software, that you receive source code or can get it if you want it,
that you can change the software or use pieces of it in new free
programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of a such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must tell them their rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any program or other work which
contains a notice placed by the copyright holder saying it may be
distributed under the terms of this General Public License.  The
"Program", below, refers to any such program or work, and a "work based
on the Program" means either the Program or any work containing the
Program or a portion of it, either verbatim or with modifications.  Each
licensee is addressed as "you".

  1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice and
disclaimer of warranty; keep intact all the notices that refer to this
General Public License and to the absence of any warranty; and give any
other recipients of the Program a copy of this General Public License
along with the Program.  You may charge a fee for the physical act of
transferring a copy.

  2. You may modify your copy or copies of the Program or any portion of
it, and copy and distribute such modifications under the terms of Paragraph
1 above, provided that you also do the following:

    a) cause the modified files to carry prominent notices stating that
    you changed the files and the date of any change; and

    b) cause the whole of any work that you distribute or publish, that
    in whole or in part contains the Program or any part thereof, either
    with or without modifications, to be licensed at no charge to all
    third parties under the terms of this General Public License (except
    that you may choose to grant warranty protection to some or all
    third parties, at your option).

    c) If the modified program normally reads commands interactively when
    run, you must cause it, when started running for such interactive use
    in the simplest and most usual way, to print or display an
    announcement including an appropriate copyright notice and a notice
    that there is no warranty (or else, saying that you provide a
    warranty) and that users may redistribute the program under these
    conditions, and telling the user how to view a copy of this General
    Public License.

    d) You may charge a fee for the physical act of transferring a
    copy, and you may at your option offer warranty protection in
    exchange for a fee.

Mere aggregation of another independent work with the Program (or its
derivative) on a volume of a storage or distribution medium does not bring
the other work under the scope of these terms.

  3. You may copy and distribute the Program (or a portion or derivative of
it, under Paragraph 2) in object code or executable form under the terms of
Paragraphs 1 and 2 above provided that you also do one of the following:

    a) accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of
    Paragraphs 1 and 2 above; or,

    b) accompany it with a written offer, valid for at least three
    years, to give any third party free (except for a nominal charge
    for the cost of distribution) a complete machine-readable copy of the
    corresponding source code, to be distributed under the terms of
    Paragraphs 1 and 2 above; or,

    c) accompany it with the information you received as to where the
    corresponding source code may be obtained.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form alone.)

Source code for a work means the preferred form of the work for making
modifications to it.  For an executable file, complete source code means
all the source code for all modules it contains; but, as a special
exception, it need not include source code for modules which are standard
libraries that accompany the operating system on which the executable
file runs, or for standard header files or definitions files that
accompany that operating system.

  4. You may not copy, modify, sublicense, distribute or transfer the
Program except as expressly provided under this General Public License.
Any attempt otherwise to copy, modify, sublicense, distribute or transfer
the Program is void, and will automatically terminate your rights to use
the Program under this License.  However, parties who have received
copies, or rights to use copies, from you under this General Public
License will not have their licenses terminated so long as such parties
remain in full compliance.

  5. By copying, distributing or modifying the Program (or any work based
on the Program) you indicate your acceptance of this license to do so,
and all its terms and conditions.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the original
licensor to copy, distribute or modify the Program subject to these
terms and conditions.  You may not impose any further restrictions on the
recipients' exercise of the rights granted herein.

  7. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of the license which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
the license, you may choose any version ever published by the Free Software
Foundation.

  8. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

        Appendix: How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.

  To do so, attach the following notices to the program.  It is safest to
attach them to the start of each source file to most effectively convey
the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) 19yy  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 1, or (at your option)
    any later version.

    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.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) 19xx name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License.  Of course, the
commands you use may be called something other than `show w' and `show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  program `Gnomovision' (a program to direct compilers to make passes
  at assemblers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

That's all there is to it!


--- The Perl Artistic License 1.0 ---

This software is Copyright (c) 2024 by Ricardo SIGNES.

This is free software, licensed under:

  The Perl Artistic License 1.0





                         The "Artistic License"

                                Preamble

The intent of this document is to state the conditions under which a
Package may be copied, such that the Copyright Holder maintains some
semblance of artistic control over the development of the package,
while giving the users of the package the right to use and distribute
the Package in a more-or-less customary fashion, plus the right to make
reasonable modifications.

Definitions:

        "Package" refers to the collection of files distributed by the
        Copyright Holder, and derivatives of that collection of files
        created through textual modification.

        "Standard Version" refers to such a Package if it has not been
        modified, or has been modified in accordance with the wishes
        of the Copyright Holder as specified below.

        "Copyright Holder" is whoever is named in the copyright or
        copyrights for the package.

        "You" is you, if you're thinking about copying or distributing
        this Package.

        "Reasonable copying fee" is whatever you can justify on the
        basis of media cost, duplication charges, time of people involved,
        and so on.  (You will not be required to justify it to the
        Copyright Holder, but only to the computing community at large
        as a market that must bear the fee.)

        "Freely Available" means that no fee is charged for the item
        itself, though there may be fees involved in handling the item.
        It also means that recipients of the item may redistribute it
        under the same conditions they received it.

1. You may make and give away verbatim copies of the source form of the
Standard Version of this Package without restriction, provided that you
duplicate all of the original copyright notices and associated disclaimers.

2. You may apply bug fixes, portability fixes and other modifications
derived from the Public Domain or from the Copyright Holder.  A Package
modified in such a way shall still be considered the Standard Version.

3. You may otherwise modify your copy of this Package in any way, provided
that you insert a prominent notice in each changed file stating how and
when you changed that file, and provided that you do at least ONE of the
following:

    a) place your modifications in the Public Domain or otherwise make them
    Freely Available, such as by posting said modifications to Usenet or
    an equivalent medium, or placing the modifications on a major archive
    site such as uunet.uu.net, or by allowing the Copyright Holder to include
    your modifications in the Standard Version of the Package.

    b) use the modified Package only within your corporation or organization.

    c) rename any non-standard executables so the names do not conflict
    with standard executables, which must also be provided, and provide
    a separate manual page for each non-standard executable that clearly
    documents how it differs from the Standard Version.

    d) make other distribution arrangements with the Copyright Holder.

4. You may distribute the programs of this Package in object code or
executable form, provided that you do at least ONE of the following:

    a) distribute a Standard Version of the executables and library files,
    together with instructions (in the manual page or equivalent) on where
    to get the Standard Version.

    b) accompany the distribution with the machine-readable source of
    the Package with your modifications.

    c) give non-standard executables non-standard names, and clearly
    document the differences in manual pages (or equivalent), together
    with instructions on where to get the Standard Version.

    d) make other distribution arrangements with the Copyright Holder.

5. You may charge a reasonable copying fee for any distribution of this
Package.  You may charge any fee you choose for support of this
Package.  You may not charge a fee for this Package itself.  However,
you may distribute this Package in aggregate with other (possibly
commercial) programs as part of a larger (possibly commercial) software
distribution provided that you do not advertise this Package as a
product of your own.  You may embed this Package's interpreter within
an executable of yours (by linking); this shall be construed as a mere
form of aggregation, provided that the complete Standard Version of the
interpreter is so embedded.

6. The scripts and library files supplied as input to or produced as
output from the programs of this Package do not automatically fall
under the copyright of this Package, but belong to whoever generated
them, and may be sold commercially, and may be aggregated with this
Package.  If such scripts or library files are aggregated with this
Package via the so-called "undump" or "unexec" methods of producing a
binary executable image, then distribution of such an image shall
neither be construed as a distribution of this Package nor shall it
fall under the restrictions of Paragraphs 3 and 4, provided that you do
not represent such an executable image as a Standard Version of this
Package.

7. C subroutines (or comparably compiled subroutines in other
languages) supplied by you and linked into this Package in order to
emulate subroutines and variables of the language defined by this
Package shall not be considered part of this Package, but are the
equivalent of input as in Paragraph 6, provided these subroutines do
not change the language in any way that would cause it to fail the
regression tests for the language.

8. Aggregation of this Package with a commercial distribution is always
permitted provided that the use of this Package is embedded; that is,
when no overt attempt is made to make this Package's interfaces visible
to the end user of the commercial distribution.  Such use shall not be
construed as a distribution of this Package.

9. The name of the Copyright Holder may not be used to endorse or promote
products derived from this software without specific prior written permission.

10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

                                The End

MANIFEST  view on Meta::CPAN

# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.031.
Changes
LICENSE
MANIFEST
META.json
META.yml
Makefile.PL
README
dist.ini
lib/Pod/Weaver.pm
lib/Pod/Weaver/Config.pm
lib/Pod/Weaver/Config/Assembler.pm
lib/Pod/Weaver/Config/Finder.pm
lib/Pod/Weaver/Plugin/EnsurePod5.pm
lib/Pod/Weaver/Plugin/H1Nester.pm
lib/Pod/Weaver/Plugin/SingleEncoding.pm
lib/Pod/Weaver/Plugin/Transformer.pm
lib/Pod/Weaver/PluginBundle/CorePrep.pm
lib/Pod/Weaver/PluginBundle/Default.pm
lib/Pod/Weaver/Role/Dialect.pm
lib/Pod/Weaver/Role/Finalizer.pm
lib/Pod/Weaver/Role/Plugin.pm
lib/Pod/Weaver/Role/Preparer.pm
lib/Pod/Weaver/Role/Section.pm
lib/Pod/Weaver/Role/StringFromComment.pm
lib/Pod/Weaver/Role/Transformer.pm
lib/Pod/Weaver/Section/Authors.pm
lib/Pod/Weaver/Section/Bugs.pm
lib/Pod/Weaver/Section/Collect.pm
lib/Pod/Weaver/Section/GenerateSection.pm
lib/Pod/Weaver/Section/Generic.pm
lib/Pod/Weaver/Section/Leftovers.pm
lib/Pod/Weaver/Section/Legal.pm
lib/Pod/Weaver/Section/Name.pm
lib/Pod/Weaver/Section/Region.pm
lib/Pod/Weaver/Section/Version.pm
t/00-report-prereqs.dd
t/00-report-prereqs.t
t/basic.t
t/eg/basic.in.pod
t/eg/basic.out.pod
t/eg/encoding.in.pod
t/eg/encoding.out.pod
t/eg/legal_t1.in.pod
t/eg/legal_t1.out.pod
t/eg/legal_t2.in.pod
t/eg/legal_t2.out.pod
t/eg/region_t1.in.pod
t/eg/region_t1.out.pod
t/eg/region_t2.in.pod
t/eg/region_t2.out.pod
t/eg/region_t3.in.pod
t/eg/region_t3.out.pod
t/eg/region_t4.in.pod
t/eg/region_t4.out.pod
t/eg/version_t1.in.pod
t/eg/version_t1.out.pod
t/eg/version_t2.in.pod
t/eg/version_t2.out.pod
t/eg/version_t3.in.pod
t/eg/version_t3.out.pod
t/eg/version_t4.in.pod
t/eg/version_t4.out.pod
t/eg/version_t5.in.pod
t/eg/version_t5.out.pod
t/eg/version_t6-trial.out.pod
t/eg/version_t6.in.pod
t/eg/version_t6.out.pod
t/eg/version_without_package.in.pod
t/eg/version_without_package.out.pod
t/eg/weaver.ini
t/encoding.t
t/generate-section.t
t/ini-config.t
t/legal_section.t
t/region_options.t
t/required_region.t
t/required_section.t
t/version_options.t
t/version_without_package.t
xt/author/pod-syntax.t
xt/release/changes_has_content.t

META.json  view on Meta::CPAN

{
   "abstract" : "weave together a Pod document from an outline",
   "author" : [
      "Ricardo SIGNES <cpan@semiotic.systems>"
   ],
   "dynamic_config" : 0,
   "generated_by" : "Dist::Zilla version 6.031, CPAN::Meta::Converter version 2.150010",
   "license" : [
      "perl_5"
   ],
   "meta-spec" : {
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
      "version" : 2
   },
   "name" : "Pod-Weaver",
   "prereqs" : {
      "configure" : {
         "requires" : {
            "ExtUtils::MakeMaker" : "6.78"
         }
      },
      "develop" : {
         "requires" : {
            "Encode" : "0",
            "Test::More" : "0",
            "Test::Pod" : "1.41"
         }
      },
      "runtime" : {
         "requires" : {
            "Config::MVP" : "2",
            "Config::MVP::Assembler" : "0",
            "Config::MVP::Assembler::WithBundles" : "0",
            "Config::MVP::Reader::Finder" : "0",
            "Config::MVP::Reader::INI" : "0",
            "DateTime" : "0",
            "File::Spec" : "0",
            "List::MoreUtils" : "0",
            "List::Util" : "1.33",
            "Log::Dispatchouli" : "1.100710",
            "Mixin::Linewise::Readers" : "0.103",
            "Module::Runtime" : "0",
            "Moose" : "0",
            "Moose::Role" : "0",
            "Moose::Util::TypeConstraints" : "0",
            "Params::Util" : "0",
            "Pod::Elemental" : "0.100220",
            "Pod::Elemental::Document" : "0",
            "Pod::Elemental::Element::Nested" : "0",
            "Pod::Elemental::Element::Pod5::Command" : "0",
            "Pod::Elemental::Element::Pod5::Ordinary" : "0",
            "Pod::Elemental::Element::Pod5::Region" : "0",
            "Pod::Elemental::Element::Pod5::Verbatim" : "0",
            "Pod::Elemental::Selectors" : "0",
            "Pod::Elemental::Transformer::Gatherer" : "0",
            "Pod::Elemental::Transformer::Nester" : "0",
            "Pod::Elemental::Transformer::Pod5" : "0",
            "Pod::Elemental::Types" : "0",
            "String::Flogger" : "1",
            "String::Formatter" : "0.100680",
            "String::RewritePrefix" : "0",
            "Text::Template" : "0",
            "Text::Wrap" : "0",
            "experimental" : "0",
            "feature" : "0",
            "namespace::autoclean" : "0",
            "perl" : "v5.20.0",
            "strict" : "0",
            "utf8" : "0",
            "warnings" : "0"
         }
      },
      "test" : {
         "recommends" : {
            "CPAN::Meta" : "2.120900"
         },
         "requires" : {
            "ExtUtils::MakeMaker" : "0",
            "File::Spec" : "0",
            "PPI" : "0",
            "Software::License::Artistic_1_0" : "0",
            "Software::License::Perl_5" : "0",
            "Test::Differences" : "0",
            "Test::More" : "0.96"
         }
      }
   },
   "release_status" : "stable",
   "resources" : {
      "bugtracker" : {
         "web" : "https://github.com/rjbs/Pod-Weaver/issues"
      },
      "homepage" : "https://github.com/rjbs/Pod-Weaver",
      "repository" : {
         "type" : "git",
         "url" : "https://github.com/rjbs/Pod-Weaver.git",
         "web" : "https://github.com/rjbs/Pod-Weaver"
      }
   },
   "version" : "4.020",
   "x_Dist_Zilla" : {
      "perl" : {
         "version" : "5.038000"
      },
      "plugins" : [
         {
            "class" : "Dist::Zilla::Plugin::Prereqs",
            "config" : {
               "Dist::Zilla::Plugin::Prereqs" : {
                  "phase" : "runtime",
                  "type" : "requires"
               }
            },
            "name" : "Prereqs",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::GatherDir",
            "config" : {
               "Dist::Zilla::Plugin::GatherDir" : {
                  "exclude_filename" : [],
                  "exclude_match" : [],
                  "include_dotfiles" : 0,
                  "prefix" : "",
                  "prune_directory" : [],
                  "root" : "."
               },
               "Dist::Zilla::Plugin::Git::GatherDir" : {
                  "include_untracked" : 0
               }
            },
            "name" : "@RJBS/Git::GatherDir",
            "version" : "2.049"
         },
         {
            "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed",
            "name" : "@RJBS/CheckPrereqsIndexed",
            "version" : "0.022"
         },
         {
            "class" : "Dist::Zilla::Plugin::CheckExtraTests",
            "name" : "@RJBS/CheckExtraTests",
            "version" : "0.029"
         },
         {
            "class" : "Dist::Zilla::Plugin::PromptIfStale",
            "config" : {
               "Dist::Zilla::Plugin::PromptIfStale" : {
                  "check_all_plugins" : 0,
                  "check_all_prereqs" : 0,
                  "modules" : [
                     "Dist::Zilla::PluginBundle::RJBS"
                  ],
                  "phase" : "build",
                  "run_under_travis" : 0,
                  "skip" : []
               }
            },
            "name" : "@RJBS/RJBS-Outdated",
            "version" : "0.058"
         },
         {
            "class" : "Dist::Zilla::Plugin::PromptIfStale",
            "config" : {
               "Dist::Zilla::Plugin::PromptIfStale" : {
                  "check_all_plugins" : 1,
                  "check_all_prereqs" : 0,
                  "modules" : [],
                  "phase" : "release",
                  "run_under_travis" : 0,
                  "skip" : [
                     "Dist::Zilla::Plugin::RJBSMisc"
                  ]
               }
            },
            "name" : "@RJBS/CPAN-Outdated",
            "version" : "0.058"
         },
         {
            "class" : "Dist::Zilla::Plugin::PruneCruft",
            "name" : "@RJBS/@Filter/PruneCruft",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::ManifestSkip",
            "name" : "@RJBS/@Filter/ManifestSkip",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::MetaYAML",
            "name" : "@RJBS/@Filter/MetaYAML",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::License",
            "name" : "@RJBS/@Filter/License",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::Readme",
            "name" : "@RJBS/@Filter/Readme",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::ExecDir",
            "name" : "@RJBS/@Filter/ExecDir",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::ShareDir",
            "name" : "@RJBS/@Filter/ShareDir",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::Manifest",
            "name" : "@RJBS/@Filter/Manifest",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::TestRelease",
            "name" : "@RJBS/@Filter/TestRelease",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::ConfirmRelease",
            "name" : "@RJBS/@Filter/ConfirmRelease",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::UploadToCPAN",
            "name" : "@RJBS/@Filter/UploadToCPAN",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::MakeMaker",
            "config" : {
               "Dist::Zilla::Role::TestRunner" : {
                  "default_jobs" : 9
               }
            },
            "name" : "@RJBS/MakeMaker",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::AutoPrereqs",
            "name" : "@RJBS/AutoPrereqs",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::NextVersion",
            "config" : {
               "Dist::Zilla::Plugin::Git::NextVersion" : {
                  "first_version" : "0.001",
                  "version_by_branch" : 1,
                  "version_regexp" : "(?^:^([0-9]+\\.[0-9]+)$)"
               },
               "Dist::Zilla::Role::Git::Repo" : {
                  "git_version" : "2.44.0",
                  "repo_root" : "."
               }
            },
            "name" : "@RJBS/Git::NextVersion",
            "version" : "2.049"
         },
         {
            "class" : "Dist::Zilla::Plugin::PkgVersion",
            "name" : "@RJBS/PkgVersion",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::MetaConfig",
            "name" : "@RJBS/MetaConfig",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::MetaJSON",
            "name" : "@RJBS/MetaJSON",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::NextRelease",
            "name" : "@RJBS/NextRelease",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent",
            "name" : "@RJBS/Test::ChangesHasContent",
            "version" : "0.011"
         },
         {
            "class" : "Dist::Zilla::Plugin::PodSyntaxTests",
            "name" : "@RJBS/PodSyntaxTests",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs",
            "name" : "@RJBS/Test::ReportPrereqs",
            "version" : "0.029"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Remote::Check",
            "name" : "@RJBS/Git::Remote::Check",
            "version" : "0.1.2"
         },
         {
            "class" : "Dist::Zilla::Plugin::Prereqs",
            "config" : {
               "Dist::Zilla::Plugin::Prereqs" : {
                  "phase" : "test",
                  "type" : "requires"
               }
            },
            "name" : "@RJBS/TestMoreWithSubtests",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::PodWeaver",
            "config" : {
               "Dist::Zilla::Plugin::PodWeaver" : {
                  "config_plugins" : [
                     "@RJBS"
                  ],
                  "finder" : [
                     ":InstallModules",
                     ":PerlExecFiles"
                  ],
                  "plugins" : [
                     {
                        "class" : "Pod::Weaver::Plugin::EnsurePod5",
                        "name" : "@CorePrep/EnsurePod5",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Plugin::H1Nester",
                        "name" : "@CorePrep/H1Nester",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Plugin::SingleEncoding",
                        "name" : "@RJBS/SingleEncoding",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Name",
                        "name" : "@RJBS/Name",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Version",
                        "name" : "@RJBS/Version",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Region",
                        "name" : "@RJBS/Prelude",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Generic",
                        "name" : "@RJBS/Synopsis",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Generic",
                        "name" : "@RJBS/Description",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Generic",
                        "name" : "@RJBS/Overview",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Generic",
                        "name" : "@RJBS/Stability",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::GenerateSection",
                        "name" : "@RJBS/PerlSupport",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Collect",
                        "name" : "Attributes",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Collect",
                        "name" : "Methods",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Collect",
                        "name" : "Functions",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Leftovers",
                        "name" : "@RJBS/Leftovers",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Region",
                        "name" : "@RJBS/postlude",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Authors",
                        "name" : "@RJBS/Authors",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Contributors",
                        "name" : "@RJBS/Contributors",
                        "version" : "0.009"
                     },
                     {
                        "class" : "Pod::Weaver::Section::Legal",
                        "name" : "@RJBS/Legal",
                        "version" : "4.020"
                     },
                     {
                        "class" : "Pod::Weaver::Plugin::Transformer",
                        "name" : "@RJBS/List",
                        "version" : "4.020"
                     }
                  ]
               }
            },
            "name" : "@RJBS/PodWeaver",
            "version" : "4.010"
         },
         {
            "class" : "Dist::Zilla::Plugin::RJBSMisc",
            "name" : "@RJBS/RJBSMisc",
            "version" : "5.026"
         },
         {
            "class" : "Dist::Zilla::Plugin::GithubMeta",
            "name" : "@RJBS/GithubMeta",
            "version" : "0.58"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Check",
            "config" : {
               "Dist::Zilla::Plugin::Git::Check" : {
                  "untracked_files" : "die"
               },
               "Dist::Zilla::Role::Git::DirtyFiles" : {
                  "allow_dirty" : [
                     "Changes",
                     "dist.ini"
                  ],
                  "allow_dirty_match" : [],
                  "changelog" : "Changes"
               },
               "Dist::Zilla::Role::Git::Repo" : {
                  "git_version" : "2.44.0",
                  "repo_root" : "."
               }
            },
            "name" : "@RJBS/@Git/Check",
            "version" : "2.049"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Commit",
            "config" : {
               "Dist::Zilla::Plugin::Git::Commit" : {
                  "add_files_in" : [],
                  "commit_msg" : "v%V%n%n%c",
                  "signoff" : 0
               },
               "Dist::Zilla::Role::Git::DirtyFiles" : {
                  "allow_dirty" : [
                     "Changes",
                     "dist.ini"
                  ],
                  "allow_dirty_match" : [],
                  "changelog" : "Changes"
               },
               "Dist::Zilla::Role::Git::Repo" : {
                  "git_version" : "2.44.0",
                  "repo_root" : "."
               },
               "Dist::Zilla::Role::Git::StringFormatter" : {
                  "time_zone" : "local"
               }
            },
            "name" : "@RJBS/@Git/Commit",
            "version" : "2.049"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Tag",
            "config" : {
               "Dist::Zilla::Plugin::Git::Tag" : {
                  "branch" : null,
                  "changelog" : "Changes",
                  "signed" : 0,
                  "tag" : "4.020",
                  "tag_format" : "%v",
                  "tag_message" : "v%V"
               },
               "Dist::Zilla::Role::Git::Repo" : {
                  "git_version" : "2.44.0",
                  "repo_root" : "."
               },
               "Dist::Zilla::Role::Git::StringFormatter" : {
                  "time_zone" : "local"
               }
            },
            "name" : "@RJBS/@Git/Tag",
            "version" : "2.049"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Push",
            "config" : {
               "Dist::Zilla::Plugin::Git::Push" : {
                  "push_to" : [
                     "github :"
                  ],
                  "remotes_must_exist" : 0
               },
               "Dist::Zilla::Role::Git::Repo" : {
                  "git_version" : "2.44.0",
                  "repo_root" : "."
               }
            },
            "name" : "@RJBS/@Git/Push",
            "version" : "2.049"
         },
         {
            "class" : "Dist::Zilla::Plugin::Git::Contributors",
            "config" : {
               "Dist::Zilla::Plugin::Git::Contributors" : {
                  "git_version" : "2.44.0",
                  "include_authors" : 0,
                  "include_releaser" : 1,
                  "order_by" : "name",
                  "paths" : []
               }
            },
            "name" : "@RJBS/Git::Contributors",
            "version" : "0.037"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":InstallModules",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":IncModules",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":TestFiles",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":ExtraTestFiles",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":ExecFiles",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":PerlExecFiles",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":ShareFiles",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":MainModule",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":AllFiles",
            "version" : "6.031"
         },
         {
            "class" : "Dist::Zilla::Plugin::FinderCode",
            "name" : ":NoFiles",
            "version" : "6.031"
         }
      ],
      "zilla" : {
         "class" : "Dist::Zilla::Dist::Builder",
         "config" : {
            "is_trial" : 0
         },
         "version" : "6.031"
      }
   },
   "x_contributors" : [
      "Alex Peters <lxp@cpan.org>",
      "Apocalypse <perl@0ne.us>",
      "Blabos de Blebe <blabos@cpan.org>",
      "Caleb Cushing <xenoterracide@gmail.com>",
      "Christian Walde <walde.christian@googlemail.com>",
      "Christopher J. Madsen <perl@cjmweb.net>",
      "Chris Weyl <cweyl@alumni.drew.edu>",
      "Dave Houston <dave.houston@gmail.com>",
      "Dave Rolsky <autarch@urth.org>",
      "David E. Wheeler <david@justatheory.com>",
      "David Golden <dagolden@cpan.org>",
      "David Miguel Susano Pinto <carandraug+dev@gmail.com>",
      "David Zurborg <post@david-zurb.org>",
      "Doug Bell <doug@preaction.me>",
      "Florian Ragwitz <rafl@debian.org>",
      "Jonathan \"Duke\" Leto <jonathan@leto.net>",
      "Joshua Keroes <joshua.keroes@integratelecom.com>",
      "Karen Etheridge <ether@cpan.org>",
      "Kent Fredric <kentfredric@gmail.com>",
      "Kivanc Yazan <kyzn@cpan.org>",
      "Marcel Gruenauer <hanekomu@gmail.com>",
      "Randy Stauner <randy@magnificent-tears.com>",
      "Ricardo Signes <rjbs@semiotic.systems>",
      "Sam Graham <git@illusori.co.uk>",
      "Shlomi Fish <shlomif@shlomifish.org>"
   ],
   "x_generated_by_perl" : "v5.38.0",
   "x_rjbs_perl_window" : "standard",
   "x_serialization_backend" : "Cpanel::JSON::XS version 4.37",
   "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later"
}

META.yml  view on Meta::CPAN

---
abstract: 'weave together a Pod document from an outline'
author:
  - 'Ricardo SIGNES <cpan@semiotic.systems>'
build_requires:
  ExtUtils::MakeMaker: '0'
  File::Spec: '0'
  PPI: '0'
  Software::License::Artistic_1_0: '0'
  Software::License::Perl_5: '0'
  Test::Differences: '0'
  Test::More: '0.96'
configure_requires:
  ExtUtils::MakeMaker: '6.78'
dynamic_config: 0
generated_by: 'Dist::Zilla version 6.031, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
  url: http://module-build.sourceforge.net/META-spec-v1.4.html
  version: '1.4'
name: Pod-Weaver
requires:
  Config::MVP: '2'
  Config::MVP::Assembler: '0'
  Config::MVP::Assembler::WithBundles: '0'
  Config::MVP::Reader::Finder: '0'
  Config::MVP::Reader::INI: '0'
  DateTime: '0'
  File::Spec: '0'
  List::MoreUtils: '0'
  List::Util: '1.33'
  Log::Dispatchouli: '1.100710'
  Mixin::Linewise::Readers: '0.103'
  Module::Runtime: '0'
  Moose: '0'
  Moose::Role: '0'
  Moose::Util::TypeConstraints: '0'
  Params::Util: '0'
  Pod::Elemental: '0.100220'
  Pod::Elemental::Document: '0'
  Pod::Elemental::Element::Nested: '0'
  Pod::Elemental::Element::Pod5::Command: '0'
  Pod::Elemental::Element::Pod5::Ordinary: '0'
  Pod::Elemental::Element::Pod5::Region: '0'
  Pod::Elemental::Element::Pod5::Verbatim: '0'
  Pod::Elemental::Selectors: '0'
  Pod::Elemental::Transformer::Gatherer: '0'
  Pod::Elemental::Transformer::Nester: '0'
  Pod::Elemental::Transformer::Pod5: '0'
  Pod::Elemental::Types: '0'
  String::Flogger: '1'
  String::Formatter: '0.100680'
  String::RewritePrefix: '0'
  Text::Template: '0'
  Text::Wrap: '0'
  experimental: '0'
  feature: '0'
  namespace::autoclean: '0'
  perl: v5.20.0
  strict: '0'
  utf8: '0'
  warnings: '0'
resources:
  bugtracker: https://github.com/rjbs/Pod-Weaver/issues
  homepage: https://github.com/rjbs/Pod-Weaver
  repository: https://github.com/rjbs/Pod-Weaver.git
version: '4.020'
x_Dist_Zilla:
  perl:
    version: '5.038000'
  plugins:
    -
      class: Dist::Zilla::Plugin::Prereqs
      config:
        Dist::Zilla::Plugin::Prereqs:
          phase: runtime
          type: requires
      name: Prereqs
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::Git::GatherDir
      config:
        Dist::Zilla::Plugin::GatherDir:
          exclude_filename: []
          exclude_match: []
          include_dotfiles: 0
          prefix: ''
          prune_directory: []
          root: .
        Dist::Zilla::Plugin::Git::GatherDir:
          include_untracked: 0
      name: '@RJBS/Git::GatherDir'
      version: '2.049'
    -
      class: Dist::Zilla::Plugin::CheckPrereqsIndexed
      name: '@RJBS/CheckPrereqsIndexed'
      version: '0.022'
    -
      class: Dist::Zilla::Plugin::CheckExtraTests
      name: '@RJBS/CheckExtraTests'
      version: '0.029'
    -
      class: Dist::Zilla::Plugin::PromptIfStale
      config:
        Dist::Zilla::Plugin::PromptIfStale:
          check_all_plugins: 0
          check_all_prereqs: 0
          modules:
            - Dist::Zilla::PluginBundle::RJBS
          phase: build
          run_under_travis: 0
          skip: []
      name: '@RJBS/RJBS-Outdated'
      version: '0.058'
    -
      class: Dist::Zilla::Plugin::PromptIfStale
      config:
        Dist::Zilla::Plugin::PromptIfStale:
          check_all_plugins: 1
          check_all_prereqs: 0
          modules: []
          phase: release
          run_under_travis: 0
          skip:
            - Dist::Zilla::Plugin::RJBSMisc
      name: '@RJBS/CPAN-Outdated'
      version: '0.058'
    -
      class: Dist::Zilla::Plugin::PruneCruft
      name: '@RJBS/@Filter/PruneCruft'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::ManifestSkip
      name: '@RJBS/@Filter/ManifestSkip'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::MetaYAML
      name: '@RJBS/@Filter/MetaYAML'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::License
      name: '@RJBS/@Filter/License'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::Readme
      name: '@RJBS/@Filter/Readme'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::ExecDir
      name: '@RJBS/@Filter/ExecDir'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::ShareDir
      name: '@RJBS/@Filter/ShareDir'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::Manifest
      name: '@RJBS/@Filter/Manifest'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::TestRelease
      name: '@RJBS/@Filter/TestRelease'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::ConfirmRelease
      name: '@RJBS/@Filter/ConfirmRelease'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::UploadToCPAN
      name: '@RJBS/@Filter/UploadToCPAN'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::MakeMaker
      config:
        Dist::Zilla::Role::TestRunner:
          default_jobs: 9
      name: '@RJBS/MakeMaker'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::AutoPrereqs
      name: '@RJBS/AutoPrereqs'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::Git::NextVersion
      config:
        Dist::Zilla::Plugin::Git::NextVersion:
          first_version: '0.001'
          version_by_branch: 1
          version_regexp: (?^:^([0-9]+\.[0-9]+)$)
        Dist::Zilla::Role::Git::Repo:
          git_version: 2.44.0
          repo_root: .
      name: '@RJBS/Git::NextVersion'
      version: '2.049'
    -
      class: Dist::Zilla::Plugin::PkgVersion
      name: '@RJBS/PkgVersion'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::MetaConfig
      name: '@RJBS/MetaConfig'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::MetaJSON
      name: '@RJBS/MetaJSON'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::NextRelease
      name: '@RJBS/NextRelease'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::Test::ChangesHasContent
      name: '@RJBS/Test::ChangesHasContent'
      version: '0.011'
    -
      class: Dist::Zilla::Plugin::PodSyntaxTests
      name: '@RJBS/PodSyntaxTests'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::Test::ReportPrereqs
      name: '@RJBS/Test::ReportPrereqs'
      version: '0.029'
    -
      class: Dist::Zilla::Plugin::Git::Remote::Check
      name: '@RJBS/Git::Remote::Check'
      version: 0.1.2
    -
      class: Dist::Zilla::Plugin::Prereqs
      config:
        Dist::Zilla::Plugin::Prereqs:
          phase: test
          type: requires
      name: '@RJBS/TestMoreWithSubtests'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::PodWeaver
      config:
        Dist::Zilla::Plugin::PodWeaver:
          config_plugins:
            - '@RJBS'
          finder:
            - ':InstallModules'
            - ':PerlExecFiles'
          plugins:
            -
              class: Pod::Weaver::Plugin::EnsurePod5
              name: '@CorePrep/EnsurePod5'
              version: '4.020'
            -
              class: Pod::Weaver::Plugin::H1Nester
              name: '@CorePrep/H1Nester'
              version: '4.020'
            -
              class: Pod::Weaver::Plugin::SingleEncoding
              name: '@RJBS/SingleEncoding'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Name
              name: '@RJBS/Name'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Version
              name: '@RJBS/Version'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Region
              name: '@RJBS/Prelude'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Generic
              name: '@RJBS/Synopsis'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Generic
              name: '@RJBS/Description'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Generic
              name: '@RJBS/Overview'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Generic
              name: '@RJBS/Stability'
              version: '4.020'
            -
              class: Pod::Weaver::Section::GenerateSection
              name: '@RJBS/PerlSupport'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Collect
              name: Attributes
              version: '4.020'
            -
              class: Pod::Weaver::Section::Collect
              name: Methods
              version: '4.020'
            -
              class: Pod::Weaver::Section::Collect
              name: Functions
              version: '4.020'
            -
              class: Pod::Weaver::Section::Leftovers
              name: '@RJBS/Leftovers'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Region
              name: '@RJBS/postlude'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Authors
              name: '@RJBS/Authors'
              version: '4.020'
            -
              class: Pod::Weaver::Section::Contributors
              name: '@RJBS/Contributors'
              version: '0.009'
            -
              class: Pod::Weaver::Section::Legal
              name: '@RJBS/Legal'
              version: '4.020'
            -
              class: Pod::Weaver::Plugin::Transformer
              name: '@RJBS/List'
              version: '4.020'
      name: '@RJBS/PodWeaver'
      version: '4.010'
    -
      class: Dist::Zilla::Plugin::RJBSMisc
      name: '@RJBS/RJBSMisc'
      version: '5.026'
    -
      class: Dist::Zilla::Plugin::GithubMeta
      name: '@RJBS/GithubMeta'
      version: '0.58'
    -
      class: Dist::Zilla::Plugin::Git::Check
      config:
        Dist::Zilla::Plugin::Git::Check:
          untracked_files: die
        Dist::Zilla::Role::Git::DirtyFiles:
          allow_dirty:
            - Changes
            - dist.ini
          allow_dirty_match: []
          changelog: Changes
        Dist::Zilla::Role::Git::Repo:
          git_version: 2.44.0
          repo_root: .
      name: '@RJBS/@Git/Check'
      version: '2.049'
    -
      class: Dist::Zilla::Plugin::Git::Commit
      config:
        Dist::Zilla::Plugin::Git::Commit:
          add_files_in: []
          commit_msg: v%V%n%n%c
          signoff: 0
        Dist::Zilla::Role::Git::DirtyFiles:
          allow_dirty:
            - Changes
            - dist.ini
          allow_dirty_match: []
          changelog: Changes
        Dist::Zilla::Role::Git::Repo:
          git_version: 2.44.0
          repo_root: .
        Dist::Zilla::Role::Git::StringFormatter:
          time_zone: local
      name: '@RJBS/@Git/Commit'
      version: '2.049'
    -
      class: Dist::Zilla::Plugin::Git::Tag
      config:
        Dist::Zilla::Plugin::Git::Tag:
          branch: ~
          changelog: Changes
          signed: 0
          tag: '4.020'
          tag_format: '%v'
          tag_message: v%V
        Dist::Zilla::Role::Git::Repo:
          git_version: 2.44.0
          repo_root: .
        Dist::Zilla::Role::Git::StringFormatter:
          time_zone: local
      name: '@RJBS/@Git/Tag'
      version: '2.049'
    -
      class: Dist::Zilla::Plugin::Git::Push
      config:
        Dist::Zilla::Plugin::Git::Push:
          push_to:
            - 'github :'
          remotes_must_exist: 0
        Dist::Zilla::Role::Git::Repo:
          git_version: 2.44.0
          repo_root: .
      name: '@RJBS/@Git/Push'
      version: '2.049'
    -
      class: Dist::Zilla::Plugin::Git::Contributors
      config:
        Dist::Zilla::Plugin::Git::Contributors:
          git_version: 2.44.0
          include_authors: 0
          include_releaser: 1
          order_by: name
          paths: []
      name: '@RJBS/Git::Contributors'
      version: '0.037'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':InstallModules'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':IncModules'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':TestFiles'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':ExtraTestFiles'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':ExecFiles'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':PerlExecFiles'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':ShareFiles'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':MainModule'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':AllFiles'
      version: '6.031'
    -
      class: Dist::Zilla::Plugin::FinderCode
      name: ':NoFiles'
      version: '6.031'
  zilla:
    class: Dist::Zilla::Dist::Builder
    config:
      is_trial: 0
    version: '6.031'
x_contributors:
  - 'Alex Peters <lxp@cpan.org>'
  - 'Apocalypse <perl@0ne.us>'
  - 'Blabos de Blebe <blabos@cpan.org>'
  - 'Caleb Cushing <xenoterracide@gmail.com>'
  - 'Christian Walde <walde.christian@googlemail.com>'
  - 'Christopher J. Madsen <perl@cjmweb.net>'
  - 'Chris Weyl <cweyl@alumni.drew.edu>'
  - 'Dave Houston <dave.houston@gmail.com>'
  - 'Dave Rolsky <autarch@urth.org>'
  - 'David E. Wheeler <david@justatheory.com>'
  - 'David Golden <dagolden@cpan.org>'
  - 'David Miguel Susano Pinto <carandraug+dev@gmail.com>'
  - 'David Zurborg <post@david-zurb.org>'
  - 'Doug Bell <doug@preaction.me>'
  - 'Florian Ragwitz <rafl@debian.org>'
  - 'Jonathan "Duke" Leto <jonathan@leto.net>'
  - 'Joshua Keroes <joshua.keroes@integratelecom.com>'
  - 'Karen Etheridge <ether@cpan.org>'
  - 'Kent Fredric <kentfredric@gmail.com>'
  - 'Kivanc Yazan <kyzn@cpan.org>'
  - 'Marcel Gruenauer <hanekomu@gmail.com>'
  - 'Randy Stauner <randy@magnificent-tears.com>'
  - 'Ricardo Signes <rjbs@semiotic.systems>'
  - 'Sam Graham <git@illusori.co.uk>'
  - 'Shlomi Fish <shlomif@shlomifish.org>'
x_generated_by_perl: v5.38.0
x_rjbs_perl_window: standard
x_serialization_backend: 'YAML::Tiny version 1.74'
x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later'

Makefile.PL  view on Meta::CPAN

# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.031.
use strict;
use warnings;

use 5.020000;

use ExtUtils::MakeMaker 6.78;

my %WriteMakefileArgs = (
  "ABSTRACT" => "weave together a Pod document from an outline",
  "AUTHOR" => "Ricardo SIGNES <cpan\@semiotic.systems>",
  "CONFIGURE_REQUIRES" => {
    "ExtUtils::MakeMaker" => "6.78"
  },
  "DISTNAME" => "Pod-Weaver",
  "LICENSE" => "perl",
  "MIN_PERL_VERSION" => "5.020000",
  "NAME" => "Pod::Weaver",
  "PREREQ_PM" => {
    "Config::MVP" => 2,
    "Config::MVP::Assembler" => 0,
    "Config::MVP::Assembler::WithBundles" => 0,
    "Config::MVP::Reader::Finder" => 0,
    "Config::MVP::Reader::INI" => 0,
    "DateTime" => 0,
    "File::Spec" => 0,
    "List::MoreUtils" => 0,
    "List::Util" => "1.33",
    "Log::Dispatchouli" => "1.100710",
    "Mixin::Linewise::Readers" => "0.103",
    "Module::Runtime" => 0,
    "Moose" => 0,
    "Moose::Role" => 0,
    "Moose::Util::TypeConstraints" => 0,
    "Params::Util" => 0,
    "Pod::Elemental" => "0.100220",
    "Pod::Elemental::Document" => 0,
    "Pod::Elemental::Element::Nested" => 0,
    "Pod::Elemental::Element::Pod5::Command" => 0,
    "Pod::Elemental::Element::Pod5::Ordinary" => 0,
    "Pod::Elemental::Element::Pod5::Region" => 0,
    "Pod::Elemental::Element::Pod5::Verbatim" => 0,
    "Pod::Elemental::Selectors" => 0,
    "Pod::Elemental::Transformer::Gatherer" => 0,
    "Pod::Elemental::Transformer::Nester" => 0,
    "Pod::Elemental::Transformer::Pod5" => 0,
    "Pod::Elemental::Types" => 0,
    "String::Flogger" => 1,
    "String::Formatter" => "0.100680",
    "String::RewritePrefix" => 0,
    "Text::Template" => 0,
    "Text::Wrap" => 0,
    "experimental" => 0,
    "feature" => 0,
    "namespace::autoclean" => 0,
    "strict" => 0,
    "utf8" => 0,
    "warnings" => 0
  },
  "TEST_REQUIRES" => {
    "ExtUtils::MakeMaker" => 0,
    "File::Spec" => 0,
    "PPI" => 0,
    "Software::License::Artistic_1_0" => 0,
    "Software::License::Perl_5" => 0,
    "Test::Differences" => 0,
    "Test::More" => "0.96"
  },
  "VERSION" => "4.020",
  "test" => {
    "TESTS" => "t/*.t"
  }
);


my %FallbackPrereqs = (
  "Config::MVP" => 2,
  "Config::MVP::Assembler" => 0,
  "Config::MVP::Assembler::WithBundles" => 0,
  "Config::MVP::Reader::Finder" => 0,
  "Config::MVP::Reader::INI" => 0,
  "DateTime" => 0,
  "ExtUtils::MakeMaker" => 0,
  "File::Spec" => 0,
  "List::MoreUtils" => 0,
  "List::Util" => "1.33",
  "Log::Dispatchouli" => "1.100710",
  "Mixin::Linewise::Readers" => "0.103",
  "Module::Runtime" => 0,
  "Moose" => 0,
  "Moose::Role" => 0,
  "Moose::Util::TypeConstraints" => 0,
  "PPI" => 0,
  "Params::Util" => 0,
  "Pod::Elemental" => "0.100220",
  "Pod::Elemental::Document" => 0,
  "Pod::Elemental::Element::Nested" => 0,
  "Pod::Elemental::Element::Pod5::Command" => 0,
  "Pod::Elemental::Element::Pod5::Ordinary" => 0,
  "Pod::Elemental::Element::Pod5::Region" => 0,
  "Pod::Elemental::Element::Pod5::Verbatim" => 0,
  "Pod::Elemental::Selectors" => 0,
  "Pod::Elemental::Transformer::Gatherer" => 0,
  "Pod::Elemental::Transformer::Nester" => 0,
  "Pod::Elemental::Transformer::Pod5" => 0,
  "Pod::Elemental::Types" => 0,
  "Software::License::Artistic_1_0" => 0,
  "Software::License::Perl_5" => 0,
  "String::Flogger" => 1,
  "String::Formatter" => "0.100680",
  "String::RewritePrefix" => 0,
  "Test::Differences" => 0,
  "Test::More" => "0.96",
  "Text::Template" => 0,
  "Text::Wrap" => 0,
  "experimental" => 0,
  "feature" => 0,
  "namespace::autoclean" => 0,
  "strict" => 0,
  "utf8" => 0,
  "warnings" => 0
);


unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
  delete $WriteMakefileArgs{TEST_REQUIRES};
  delete $WriteMakefileArgs{BUILD_REQUIRES};
  $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
}

delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
  unless eval { ExtUtils::MakeMaker->VERSION(6.52) };

WriteMakefile(%WriteMakefileArgs);

README  view on Meta::CPAN

This archive contains the distribution Pod-Weaver,
version 4.020:

  weave together a Pod document from an outline

This software is copyright (c) 2024 by Ricardo SIGNES.

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


This README file was generated by Dist::Zilla::Plugin::Readme v6.031.

dist.ini  view on Meta::CPAN

name    = Pod-Weaver
author  = Ricardo SIGNES <cpan@semiotic.systems>
license = Perl_5
copyright_holder = Ricardo SIGNES

[Prereqs]
Config::MVP::Reader::INI = 0 ; to make testing simpler
Mixin::Linewise::Readers = 0.103 ; fixed string semantics

[@RJBS]
perl-window = standard

lib/Pod/Weaver.pm  view on Meta::CPAN

package Pod::Weaver 4.020;
# ABSTRACT: weave together a Pod document from an outline

use Moose;
use namespace::autoclean;

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

#pod =head1 SYNOPSIS
#pod
#pod   my $weaver = Pod::Weaver->new_with_default_config;
#pod
#pod   my $document = $weaver->weave_document({
#pod     pod_document => $pod_elemental_document,
#pod     ppi_document => $ppi_document,
#pod
#pod     license  => $software_license,
#pod     version  => $version_string,
#pod     authors  => \@author_names,
#pod   })
#pod
#pod =head1 DESCRIPTION
#pod
#pod Pod::Weaver is a system for building Pod documents from templates.  It doesn't
#pod perform simple text substitution, but instead builds a
#pod Pod::Elemental::Document.  Its plugins sketch out a series of sections
#pod that will be produced based on an existing Pod document or other provided
#pod information.
#pod
#pod =cut

use File::Spec;
use Log::Dispatchouli 1.100710; # proxy
use Pod::Elemental 0.100220;
use Pod::Elemental::Document;
use Pod::Weaver::Config::Finder;
use Pod::Weaver::Role::Plugin;
use String::Flogger 1;

#pod =attr logger
#pod
#pod This attribute stores the logger, which must provide a log method.  The
#pod weaver's log method delegates to the logger's log method.
#pod
#pod =cut

has logger => (
  is      => 'ro',
  lazy    => 1,
  default => sub {
    Log::Dispatchouli->new({
      ident     => 'Pod::Weaver',
      to_stdout => 1,
      log_pid   => 0,
    });
  },
  handles => [ qw(log log_fatal log_debug) ]
);

#pod =attr plugins
#pod
#pod This attribute is an arrayref of objects that can perform the
#pod L<Pod::Weaver::Role::Plugin> role.  In general, its contents are found through
#pod the C<L</plugins_with>> method.
#pod
#pod =cut

has plugins => (
  is  => 'ro',
  isa => 'ArrayRef[Pod::Weaver::Role::Plugin]',
  required => 1,
  lazy     => 1,
  init_arg => undef,
  default  => sub { [] },
);

#pod =method plugins_with
#pod
#pod   my $plugins_array_ref = $weaver->plugins_with('-Section');
#pod
#pod This method will return an arrayref of plugins that perform the given role, in
#pod the order of their registration.  If the role name begins with a hyphen, the
#pod method will prepend C<Pod::Weaver::Role::>.
#pod
#pod =cut

sub plugins_with {
  my ($self, $role) = @_;

  $role =~ s/^-/Pod::Weaver::Role::/;
  my @plugins = grep { $_->does($role) } $self->plugins->@*;

  return \@plugins;
}

#pod =method weave_document
#pod
#pod   my $document = $weaver->weave_document(\%input);
#pod
#pod This is the most important method in Pod::Weaver.  Given a set of input
#pod parameters, it will weave a new document.  Different section plugins will
#pod expect different input parameters to be present, but some common ones include:
#pod
#pod   pod_document - a Pod::Elemental::Document for the original Pod document
#pod   ppi_document - a PPI document for the source of the module being documented
#pod   license      - a Software::License object for the source module's license
#pod   version      - a version (string) to use in produced documentation
#pod
#pod The C<pod_document> should have gone through a L<Pod5
#pod transformer|Pod::Elemental::Transformer::Pod5>, and should probably have had
#pod its C<=head1> elements L<nested|Pod::Elemental::Transformer::Nester>.
#pod
#pod The method will return a new Pod::Elemental::Document.  The input documents may
#pod be destructively altered during the weaving process.  If they should be
#pod untouched, pass in copies.
#pod
#pod =cut

sub weave_document {
  my ($self, $input) = @_;

  my $document = Pod::Elemental::Document->new;

  for ($self->plugins_with(-Preparer)->@*) {
    $_->prepare_input($input);
  }

  for ($self->plugins_with(-Dialect)->@*) {
    $_->translate_dialect($input->{pod_document});
  }

  for ($self->plugins_with(-Transformer)->@*) {
    $_->transform_document($input->{pod_document});
  }

  for ($self->plugins_with(-Section)->@*) {
    $_->weave_section($document, $input);
  }

  for ($self->plugins_with(-Finalizer)->@*) {
    $_->finalize_document($document, $input);
  }

  return $document;
}

#pod =method new_with_default_config
#pod
#pod This method returns a new Pod::Weaver with a stock configuration by using only
#pod L<Pod::Weaver::PluginBundle::Default>.
#pod
#pod =cut

sub new_with_default_config {
  my ($class, $arg) = @_;

  my $assembler = Pod::Weaver::Config::Assembler->new;

  my $root = $assembler->section_class->new({ name => '_' });
  $assembler->sequence->add_section($root);

  $assembler->change_section('@Default');
  $assembler->end_section;

  return $class->new_from_config_sequence($assembler->sequence, $arg);
}

sub new_from_config {
  my ($class, $arg, $new_arg) = @_;

  my $root = $arg->{root} || '.';
  my $name = File::Spec->catfile($root, 'weaver');
  my ($sequence) = Pod::Weaver::Config::Finder->new->read_config($name);

  return $class->new_from_config_sequence($sequence, $new_arg);
}

sub new_from_config_sequence {
  my ($class, $seq, $arg) = @_;
  $arg ||= {};

  my $merge = $arg->{root_config} || {};

  confess("config must be a Config::MVP::Sequence")
    unless $seq and $seq->isa('Config::MVP::Sequence');

  my $core_config = $seq->section_named('_')->payload;

  my $self = $class->new({
    %$merge,
    %$core_config,
  });

  for my $section ($seq->sections) {
    next if $section->name eq '_';

    my ($name, $plugin_class, $arg) = (
      $section->name,
      $section->package,
      $section->payload,
    );

    $self->log_debug("initializing plugin $name ($plugin_class)");

    confess "arguments attempted to override 'plugin_name'"
      if defined $arg->{plugin_name};

    confess "arguments attempted to override 'weaver'"
      if defined $arg->{weaver};

    push $self->plugins->@*,
      $plugin_class->new({
        %$arg,
        plugin_name => $name,
        weaver      => $self,
      });
  }

  return $self;
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver - weave together a Pod document from an outline

=head1 VERSION

version 4.020

=head1 SYNOPSIS

  my $weaver = Pod::Weaver->new_with_default_config;

  my $document = $weaver->weave_document({
    pod_document => $pod_elemental_document,
    ppi_document => $ppi_document,

    license  => $software_license,
    version  => $version_string,
    authors  => \@author_names,
  })

=head1 DESCRIPTION

Pod::Weaver is a system for building Pod documents from templates.  It doesn't
perform simple text substitution, but instead builds a
Pod::Elemental::Document.  Its plugins sketch out a series of sections
that will be produced based on an existing Pod document or other provided
information.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 logger

This attribute stores the logger, which must provide a log method.  The
weaver's log method delegates to the logger's log method.

=head2 plugins

This attribute is an arrayref of objects that can perform the
L<Pod::Weaver::Role::Plugin> role.  In general, its contents are found through
the C<L</plugins_with>> method.

=head1 METHODS

=head2 plugins_with

  my $plugins_array_ref = $weaver->plugins_with('-Section');

This method will return an arrayref of plugins that perform the given role, in
the order of their registration.  If the role name begins with a hyphen, the
method will prepend C<Pod::Weaver::Role::>.

=head2 weave_document

  my $document = $weaver->weave_document(\%input);

This is the most important method in Pod::Weaver.  Given a set of input
parameters, it will weave a new document.  Different section plugins will
expect different input parameters to be present, but some common ones include:

  pod_document - a Pod::Elemental::Document for the original Pod document
  ppi_document - a PPI document for the source of the module being documented
  license      - a Software::License object for the source module's license
  version      - a version (string) to use in produced documentation

The C<pod_document> should have gone through a L<Pod5
transformer|Pod::Elemental::Transformer::Pod5>, and should probably have had
its C<=head1> elements L<nested|Pod::Elemental::Transformer::Nester>.

The method will return a new Pod::Elemental::Document.  The input documents may
be destructively altered during the weaving process.  If they should be
untouched, pass in copies.

=head2 new_with_default_config

This method returns a new Pod::Weaver with a stock configuration by using only
L<Pod::Weaver::PluginBundle::Default>.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 CONTRIBUTORS

=for stopwords Alex Peters Apocalypse Blabos de Blebe Caleb Cushing Christian Walde Christopher J. Madsen Chris Weyl Dave Houston Rolsky David E. Wheeler Golden Miguel Susano Pinto Zurborg Doug Bell Florian Ragwitz Jonathan "Duke" Leto Joshua Keroes ...

=over 4

=item *

Alex Peters <lxp@cpan.org>

=item *

Apocalypse <perl@0ne.us>

=item *

Blabos de Blebe <blabos@cpan.org>

=item *

Caleb Cushing <xenoterracide@gmail.com>

=item *

Christian Walde <walde.christian@googlemail.com>

=item *

Christopher J. Madsen <perl@cjmweb.net>

=item *

Chris Weyl <cweyl@alumni.drew.edu>

=item *

Dave Houston <dave.houston@gmail.com>

=item *

Dave Rolsky <autarch@urth.org>

=item *

David E. Wheeler <david@justatheory.com>

=item *

David Golden <dagolden@cpan.org>

=item *

David Miguel Susano Pinto <carandraug+dev@gmail.com>

=item *

David Zurborg <post@david-zurb.org>

=item *

Doug Bell <doug@preaction.me>

=item *

Florian Ragwitz <rafl@debian.org>

=item *

Jonathan "Duke" Leto <jonathan@leto.net>

=item *

Joshua Keroes <joshua.keroes@integratelecom.com>

=item *

Karen Etheridge <ether@cpan.org>

=item *

Kent Fredric <kentfredric@gmail.com>

=item *

Kivanc Yazan <kyzn@cpan.org>

=item *

Marcel Gruenauer <hanekomu@gmail.com>

=item *

Randy Stauner <randy@magnificent-tears.com>

=item *

Ricardo Signes <rjbs@semiotic.systems>

=item *

Sam Graham <git@illusori.co.uk>

=item *

Shlomi Fish <shlomif@shlomifish.org>

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Config.pm  view on Meta::CPAN

package Pod::Weaver::Config 4.020;
# ABSTRACT: stored configuration loader role

use Moose::Role;

use Config::MVP 2;
use Pod::Weaver::Config::Assembler;

use namespace::autoclean;

#pod =head1 DESCRIPTION
#pod
#pod The config role provides some helpers for writing a configuration loader using
#pod the L<Config::MVP|Config::MVP> system to load and validate its configuration.
#pod
#pod =attr assembler
#pod
#pod The L<assembler> attribute must be a Config::MVP::Assembler, has a sensible
#pod default that will handle the standard needs of a config loader.  Namely, it
#pod will be pre-loaded with a starting section for root configuration.
#pod
#pod =cut

sub build_assembler {
  my $assembler = Pod::Weaver::Config::Assembler->new;

  my $root = $assembler->section_class->new({
    name    => '_',
  });

  $assembler->sequence->add_section($root);

  return $assembler;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Config - stored configuration loader role

=head1 VERSION

version 4.020

=head1 DESCRIPTION

The config role provides some helpers for writing a configuration loader using
the L<Config::MVP|Config::MVP> system to load and validate its configuration.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 assembler

The L<assembler> attribute must be a Config::MVP::Assembler, has a sensible
default that will handle the standard needs of a config loader.  Namely, it
will be pre-loaded with a starting section for root configuration.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Config/Assembler.pm  view on Meta::CPAN

package Pod::Weaver::Config::Assembler 4.020;
# ABSTRACT: Pod::Weaver-specific subclass of Config::MVP::Assembler

use Moose;
extends 'Config::MVP::Assembler';
with 'Config::MVP::Assembler::WithBundles';

use String::RewritePrefix;

use namespace::autoclean;

sub expand_package {
  my $str = $_[1];

  return scalar String::RewritePrefix->rewrite(
    {
      ''  => 'Pod::Weaver::Section::',
      '-' => 'Pod::Weaver::Plugin::',
      '@' => 'Pod::Weaver::PluginBundle::',
      '=' => '',
    },
    $str,
  );
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Config::Assembler - Pod::Weaver-specific subclass of Config::MVP::Assembler

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Config/Finder.pm  view on Meta::CPAN

package Pod::Weaver::Config::Finder 4.020;
# ABSTRACT: the reader for weaver.ini files

use Moose;
extends 'Config::MVP::Reader::Finder';
with 'Pod::Weaver::Config';

use namespace::autoclean;

sub default_search_path {
  return qw(Pod::Weaver::Config Config::MVP::Reader);
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Config::Finder - the reader for weaver.ini files

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Plugin/EnsurePod5.pm  view on Meta::CPAN

package Pod::Weaver::Plugin::EnsurePod5 4.020;
# ABSTRACT: ensure that the Pod5 translator has been run on this document

use Moose;
with 'Pod::Weaver::Role::Preparer';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use namespace::autoclean;

use Pod::Elemental::Transformer::Pod5;

#pod =head1 OVERVIEW
#pod
#pod This plugin is very, very simple:  it runs the Pod5 transformer on the input
#pod document and removes any leftover whitespace-only Nonpod elements.  If
#pod non-whitespace-only Nonpod elements are found, an exception is raised.
#pod
#pod =cut

sub _strip_nonpod {
  my ($self, $node) = @_;

  # XXX: This is really stupid. -- rjbs, 2009-10-24

  foreach my $i (reverse 0 .. $node->children->$#*) {
    my $para = $node->children->[$i];

    if ($para->isa('Pod::Elemental::Element::Pod5::Nonpod')) {
      if ($para->content !~ /\S/) {
        splice $node->children->@*, $i, 1
      } else {
        confess "can't cope with a Nonpod element with non-whitespace content";
      }
    } elsif ($para->does('Pod::Elemental::Node')) {
      $self->_strip_nonpod($para);
    }
  }
}

sub prepare_input {
  my ($self, $input) = @_;
  my $pod_document = $input->{pod_document};

  Pod::Elemental::Transformer::Pod5->new->transform_node($pod_document);

  $self->_strip_nonpod($pod_document);

  return;
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Plugin::EnsurePod5 - ensure that the Pod5 translator has been run on this document

=head1 VERSION

version 4.020

=head1 OVERVIEW

This plugin is very, very simple:  it runs the Pod5 transformer on the input
document and removes any leftover whitespace-only Nonpod elements.  If
non-whitespace-only Nonpod elements are found, an exception is raised.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Plugin/H1Nester.pm  view on Meta::CPAN

package Pod::Weaver::Plugin::H1Nester 4.020;
# ABSTRACT: structure the input pod document into head1-grouped sections

use Moose;
with 'Pod::Weaver::Role::Transformer';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use namespace::autoclean;

use Pod::Elemental::Selectors -all;
use Pod::Elemental::Transformer::Nester;

#pod =head1 OVERVIEW
#pod
#pod This plugin is very, very simple:  it uses the
#pod L<Pod::Elemental::Transformer::Nester> to restructure the document under its
#pod C<=head1> elements.
#pod
#pod =cut

sub transform_document {
  my ($self, $document) = @_;

  my $nester = Pod::Elemental::Transformer::Nester->new({
    top_selector => s_command([ qw(head1) ]),
    content_selectors => [
      s_flat,
      s_command( [ qw(head2 head3 head4 over item back) ]),
    ],
  });

  $nester->transform_node($document);

  return;
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Plugin::H1Nester - structure the input pod document into head1-grouped sections

=head1 VERSION

version 4.020

=head1 OVERVIEW

This plugin is very, very simple:  it uses the
L<Pod::Elemental::Transformer::Nester> to restructure the document under its
C<=head1> elements.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Plugin/SingleEncoding.pm  view on Meta::CPAN

package Pod::Weaver::Plugin::SingleEncoding 4.020;
# ABSTRACT: ensure that there is exactly one =encoding of known value

use Moose;
with(
  'Pod::Weaver::Role::Dialect',
  'Pod::Weaver::Role::Finalizer',
);

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use namespace::autoclean;

use Pod::Elemental::Selectors -all;

#pod =head1 OVERVIEW
#pod
#pod The SingleEncoding plugin is a Dialect and a Finalizer.
#pod
#pod During dialect translation, it will look for C<=encoding> directives.  If it
#pod finds them, it will ensure that they all agree on one encoding and remove them.
#pod
#pod During document finalization, it will insert an C<=encoding> directive at the
#pod top of the output, using the encoding previously detected.  If no encoding was
#pod detected, the plugin's C<encoding> attribute will be used instead.  That
#pod defaults to UTF-8.
#pod
#pod If you want to reject any C<=encoding> directive that doesn't match your
#pod expectations, set the C<encoding> attribute by hand.
#pod
#pod No actual validation of the encoding is done.  Pod::Weaver, after all, deals in
#pod text rather than bytes.
#pod
#pod =cut

has encoding => (
  reader => 'encoding',
  writer => '_set_encoding',
  isa    => 'Str',
  lazy   => 1,
  default   => 'UTF-8',
  predicate => '_has_encoding',
);

sub translate_dialect {
  my ($self, $document) = @_;

  my $want;
  $want = $self->encoding if $self->_has_encoding;
  if ($want) {
    $self->log_debug("enforcing encoding of $want in all pod");
  }

  my $childs = $document->children;
  my $is_enc = s_command([ qw(encoding) ]);

  for (reverse 0 .. $#$childs) {
    next unless $is_enc->( $childs->[ $_ ] );
    my $have = $childs->[$_]->content;
    $have =~ s/\s+\z//;

    if (defined $want) {
      my $ok = lc $have eq lc $want
            || lc $have eq 'utf8' && lc $want eq 'utf-8';
      confess "expected only $want encoding but found $have" unless $ok;
    } else {
      $have = 'UTF-8' if lc $have eq 'utf8';
      $self->_set_encoding($have);
      $want = $have;
    }

    splice @$childs, $_, 1;
  }

  return;
}

sub finalize_document {
  my ($self, $document, $input) = @_;

  my $encoding = Pod::Elemental::Element::Pod5::Command->new({
    command => 'encoding',
    content => $self->encoding,
  });

  my $childs = $document->children;
  my $is_pod = s_command([ qw(pod) ]); # ??
  for (0 .. $#$childs) {
    next if $is_pod->( $childs->[ $_ ] );
    $self->log_debug('setting =encoding to ' . $self->encoding);
    splice @$childs, $_, 0, $encoding;
    last;
  }

  return;
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Plugin::SingleEncoding - ensure that there is exactly one =encoding of known value

=head1 VERSION

version 4.020

=head1 OVERVIEW

The SingleEncoding plugin is a Dialect and a Finalizer.

During dialect translation, it will look for C<=encoding> directives.  If it
finds them, it will ensure that they all agree on one encoding and remove them.

During document finalization, it will insert an C<=encoding> directive at the
top of the output, using the encoding previously detected.  If no encoding was
detected, the plugin's C<encoding> attribute will be used instead.  That
defaults to UTF-8.

If you want to reject any C<=encoding> directive that doesn't match your
expectations, set the C<encoding> attribute by hand.

No actual validation of the encoding is done.  Pod::Weaver, after all, deals in
text rather than bytes.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Plugin/Transformer.pm  view on Meta::CPAN

package Pod::Weaver::Plugin::Transformer 4.020;
# ABSTRACT: apply arbitrary transformers

use Moose;
with 'Pod::Weaver::Role::Dialect';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use namespace::autoclean;

use Module::Runtime qw(use_module);
use List::MoreUtils qw(part);
use String::RewritePrefix;

#pod =head1 OVERVIEW
#pod
#pod This plugin acts as a L<Pod::Weaver::Role::Dialect> that applies an arbitrary
#pod L<Pod::Elemental::Transformer> to your input document.  It is configured like
#pod this:
#pod
#pod   [-Transformer / Lists]
#pod   transformer = List
#pod   format_name = outline
#pod
#pod This will end up creating a transformer like this:
#pod
#pod   my $xform = Pod::Elemental::Transformer::List->new({
#pod     format_name => 'outline',
#pod   });
#pod
#pod and that transformer will then be handed the entire input Pod document.
#pod
#pod =cut

has transformer => (is => 'ro', required => 1);

sub BUILDARGS {
  my ($class, @arg) = @_;
  my %copy = ref $arg[0] ? $arg[0]->%* : @arg;

  my @part = part { /\A\./ ? 0 : 1 } keys %copy;

  my %class_args = map { s/\A\.//; $_ => $copy{ ".$_" } } $part[0]->@*;
  my %xform_args = map {           $_ => $copy{ $_ }    } $part[1]->@*;

  my $xform_class = String::RewritePrefix->rewrite(
    { '' => 'Pod::Elemental::Transformer::', '=' => '' },
    delete $xform_args{transformer},
  );

  use_module($xform_class);

  my $plugin_name = delete $xform_args{plugin_name};
  my $weaver      = delete $xform_args{weaver};

  my $xform = $xform_class->new(\%xform_args);

  return {
    %class_args,
    plugin_name => $plugin_name,
    weaver      => $weaver,
    transformer => $xform,
  }
}

sub translate_dialect {
  my ($self, $pod_document) = @_;

  $self->log_debug('applying transform');
  $self->transformer->transform_node( $pod_document );
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Plugin::Transformer - apply arbitrary transformers

=head1 VERSION

version 4.020

=head1 OVERVIEW

This plugin acts as a L<Pod::Weaver::Role::Dialect> that applies an arbitrary
L<Pod::Elemental::Transformer> to your input document.  It is configured like
this:

  [-Transformer / Lists]
  transformer = List
  format_name = outline

This will end up creating a transformer like this:

  my $xform = Pod::Elemental::Transformer::List->new({
    format_name => 'outline',
  });

and that transformer will then be handed the entire input Pod document.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/PluginBundle/CorePrep.pm  view on Meta::CPAN

use strict;
use warnings;
package Pod::Weaver::PluginBundle::CorePrep 4.020;
# ABSTRACT: a bundle for the most commonly-needed prep work for a pod document

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use Pod::Weaver::Plugin::H1Nester;

sub mvp_bundle_config {
  return (
    [ '@CorePrep/EnsurePod5', 'Pod::Weaver::Plugin::EnsurePod5', {} ],
    # dialects should run here
    [ '@CorePrep/H1Nester',   'Pod::Weaver::Plugin::H1Nester',   {} ],
  );
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::PluginBundle::CorePrep - a bundle for the most commonly-needed prep work for a pod document

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/PluginBundle/Default.pm  view on Meta::CPAN

use strict;
use warnings;
package Pod::Weaver::PluginBundle::Default 4.020;
# ABSTRACT: a bundle for the most commonly-needed prep work for a pod document

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

#pod =head1 OVERVIEW
#pod
#pod This is the bundle used by default (specifically by Pod::Weaver's
#pod C<new_with_default_config> method).  It may change over time, but should remain
#pod fairly conservative and straightforward.
#pod
#pod It is nearly equivalent to the following:
#pod
#pod   [@CorePrep]
#pod
#pod   [-SingleEncoding]
#pod
#pod   [Name]
#pod   [Version]
#pod
#pod   [Region  / prelude]
#pod
#pod   [Generic / SYNOPSIS]
#pod   [Generic / DESCRIPTION]
#pod   [Generic / OVERVIEW]
#pod
#pod   [Collect / ATTRIBUTES]
#pod   command = attr
#pod
#pod   [Collect / METHODS]
#pod   command = method
#pod
#pod   [Collect / FUNCTIONS]
#pod   command = func
#pod
#pod   [Leftovers]
#pod
#pod   [Region  / postlude]
#pod
#pod   [Authors]
#pod   [Legal]
#pod
#pod =cut

use namespace::autoclean;

use Pod::Weaver::Config::Assembler;
sub _exp { Pod::Weaver::Config::Assembler->expand_package($_[0]) }

sub mvp_bundle_config {
  return (
    [ '@Default/CorePrep',        _exp('@CorePrep'), {} ],
    [ '@Default/SingleEncoding',  _exp('-SingleEncoding'), {} ],
    [ '@Default/Name',            _exp('Name'),      {} ],
    [ '@Default/Version',         _exp('Version'),   {} ],

    [ '@Default/prelude',   _exp('Region'),    { region_name => 'prelude'  } ],
    [ 'SYNOPSIS',           _exp('Generic'),   {} ],
    [ 'DESCRIPTION',        _exp('Generic'),   {} ],
    [ 'OVERVIEW',           _exp('Generic'),   {} ],

    [ 'ATTRIBUTES',         _exp('Collect'),   { command => 'attr'   } ],
    [ 'METHODS',            _exp('Collect'),   { command => 'method' } ],
    [ 'FUNCTIONS',          _exp('Collect'),   { command => 'func'   } ],

    [ '@Default/Leftovers', _exp('Leftovers'), {} ],

    [ '@Default/postlude',  _exp('Region'),    { region_name => 'postlude' } ],

    [ '@Default/Authors',   _exp('Authors'),   {} ],
    [ '@Default/Legal',     _exp('Legal'),     {} ],
  )
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::PluginBundle::Default - a bundle for the most commonly-needed prep work for a pod document

=head1 VERSION

version 4.020

=head1 OVERVIEW

This is the bundle used by default (specifically by Pod::Weaver's
C<new_with_default_config> method).  It may change over time, but should remain
fairly conservative and straightforward.

It is nearly equivalent to the following:

  [@CorePrep]

  [-SingleEncoding]

  [Name]
  [Version]

  [Region  / prelude]

  [Generic / SYNOPSIS]
  [Generic / DESCRIPTION]
  [Generic / OVERVIEW]

  [Collect / ATTRIBUTES]
  command = attr

  [Collect / METHODS]
  command = method

  [Collect / FUNCTIONS]
  command = func

  [Leftovers]

  [Region  / postlude]

  [Authors]
  [Legal]

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/Dialect.pm  view on Meta::CPAN

package Pod::Weaver::Role::Dialect 4.020;
# ABSTRACT: something that translates Pod subdialects to standard Pod5

use Moose::Role;
with 'Pod::Weaver::Role::Plugin';

use namespace::autoclean;

#pod =head1 IMPLEMENTING
#pod
#pod The Dialect role indicates that a plugin will be used to pre-process the input
#pod Pod document before weaving begins.  The plugin must provide a
#pod C<translate_dialect> method which will be called with the input hashref's
#pod C<pod_document> entry.  It is expected to modify the document in place.
#pod
#pod =cut

requires 'translate_dialect';

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::Dialect - something that translates Pod subdialects to standard Pod5

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 IMPLEMENTING

The Dialect role indicates that a plugin will be used to pre-process the input
Pod document before weaving begins.  The plugin must provide a
C<translate_dialect> method which will be called with the input hashref's
C<pod_document> entry.  It is expected to modify the document in place.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/Finalizer.pm  view on Meta::CPAN

package Pod::Weaver::Role::Finalizer 4.020;
# ABSTRACT: something that goes back and finishes up after main weaving is over

use Moose::Role;
with 'Pod::Weaver::Role::Plugin';

use namespace::autoclean;

#pod =head1 IMPLEMENTING
#pod
#pod The Finalizer role indicates that a plugin will be used to post-process the
#pod output document hashref after section weaving is completed.  The plugin must
#pod provide a C<finalize_document> method which will be called as follows:
#pod
#pod   $finalizer_plugin->finalize_document($document, \%input);
#pod
#pod =cut

requires 'finalize_document';

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::Finalizer - something that goes back and finishes up after main weaving is over

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 IMPLEMENTING

The Finalizer role indicates that a plugin will be used to post-process the
output document hashref after section weaving is completed.  The plugin must
provide a C<finalize_document> method which will be called as follows:

  $finalizer_plugin->finalize_document($document, \%input);

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/Plugin.pm  view on Meta::CPAN

package Pod::Weaver::Role::Plugin 4.020;
# ABSTRACT: a Pod::Weaver plugin

use Moose::Role;

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use Params::Util qw(_HASHLIKE);

use namespace::autoclean;

#pod =head1 IMPLEMENTING
#pod
#pod This is the most basic role that all plugins must perform.
#pod
#pod =attr plugin_name
#pod
#pod This name must be unique among all other plugins loaded into a weaver.  In
#pod general, this will be set up by the configuration reader.
#pod
#pod =cut

has plugin_name => (
  is  => 'ro',
  isa => 'Str',
  required => 1,
);

#pod =attr weaver
#pod
#pod This is the Pod::Weaver object into which the plugin was loaded.  In general,
#pod this will be set up when the weaver is instantiated from config.
#pod
#pod =cut

has weaver => (
  is  => 'ro',
  isa => 'Pod::Weaver',
  required => 1,
  weak_ref => 1,
);

has logger => (
  is   => 'ro',
  lazy => 1,
  handles => [ qw(log log_debug log_fatal) ],
  default => sub {
    $_[0]->weaver->logger->proxy({
      proxy_prefix => '[' . $_[0]->plugin_name . '] ',
    });
  },
);

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::Plugin - a Pod::Weaver plugin

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 plugin_name

This name must be unique among all other plugins loaded into a weaver.  In
general, this will be set up by the configuration reader.

=head2 weaver

This is the Pod::Weaver object into which the plugin was loaded.  In general,
this will be set up when the weaver is instantiated from config.

=head1 IMPLEMENTING

This is the most basic role that all plugins must perform.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/Preparer.pm  view on Meta::CPAN

package Pod::Weaver::Role::Preparer 4.020;
# ABSTRACT: something that mucks about with the input before weaving begins

use Moose::Role;
with 'Pod::Weaver::Role::Plugin';

use namespace::autoclean;

#pod =head1 IMPLEMENTING
#pod
#pod The Preparer role indicates that a plugin will be used to pre-process the input
#pod hashref before weaving begins.  The plugin must provide a C<prepare_input>
#pod method which will be called with the input hashref.  It is expected to modify
#pod the input in place.
#pod
#pod =cut

requires 'prepare_input';

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::Preparer - something that mucks about with the input before weaving begins

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 IMPLEMENTING

The Preparer role indicates that a plugin will be used to pre-process the input
hashref before weaving begins.  The plugin must provide a C<prepare_input>
method which will be called with the input hashref.  It is expected to modify
the input in place.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/Section.pm  view on Meta::CPAN

package Pod::Weaver::Role::Section 4.020;
# ABSTRACT: a plugin that will get a section into a woven document

use Moose::Role;
with 'Pod::Weaver::Role::Plugin';

use namespace::autoclean;

#pod =head1 IMPLEMENTING
#pod
#pod This role is used by plugins that will append sections to the output document.
#pod They must provide a method, C<weave_section> which will be invoked like this:
#pod
#pod   $section_plugin->weave_section($output_document, \%input);
#pod
#pod They are expected to append their output to the output document, but they are
#pod free to behave differently if it's needed to do something really cool.
#pod
#pod =cut

requires 'weave_section';

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::Section - a plugin that will get a section into a woven document

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 IMPLEMENTING

This role is used by plugins that will append sections to the output document.
They must provide a method, C<weave_section> which will be invoked like this:

  $section_plugin->weave_section($output_document, \%input);

They are expected to append their output to the output document, but they are
free to behave differently if it's needed to do something really cool.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/StringFromComment.pm  view on Meta::CPAN

package Pod::Weaver::Role::StringFromComment 4.020;
# ABSTRACT: Extract a string from a specially formatted comment

use Moose::Role;

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use namespace::autoclean;

#pod =head1 OVERVIEW
#pod
#pod This role assists L<Pod::Weaver sections|Pod::Weaver::Role::Section> by
#pod allowing them to pull strings from the source comments formatted like:
#pod
#pod     # KEYNAME: Some string...
#pod
#pod This is probably the most familiar to people using lines like the following to
#pod allow the L<Name section|Pod::Weaver::Section::Name> to determine a module's
#pod abstract:
#pod
#pod     # ABSTRACT: Provides the HypnoToad with mind-control powers
#pod
#pod It will extract these strings by inspecting the C<ppi_document> which
#pod must be given.
#pod
#pod =head1 PRIVATE METHODS
#pod
#pod This role supplies only methods meant to be used internally by its consumer.
#pod
#pod =head2 _extract_comment_content($ppi_doc, $key)
#pod
#pod Given a key, try to find a comment matching C<# $key:> in the C<$ppi_document>
#pod and return everything but the prefix.
#pod
#pod e.g., given a document with a comment in it of the form:
#pod
#pod     # ABSTRACT: Yada yada...
#pod
#pod ...and this is called...
#pod
#pod     $self->_extract_comment_content($ppi, 'ABSTRACT')
#pod
#pod ...it returns to us:
#pod
#pod     Yada yada...
#pod
#pod =cut

sub _extract_comment_content {
  my ($self, $ppi_document, $key) = @_;

  my $regex = qr/^\s*#+\s*$key:\s*(.+)$/m;

  my $content;
  my $finder = sub {
    my $node = $_[1];
    return 0 unless $node->isa('PPI::Token::Comment');
    if ( $node->content =~ $regex ) {
      $content = $1;
      return 1;
    }
    return 0;
  };

  $ppi_document->find_first($finder);

  return $content;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::StringFromComment - Extract a string from a specially formatted comment

=head1 VERSION

version 4.020

=head1 OVERVIEW

This role assists L<Pod::Weaver sections|Pod::Weaver::Role::Section> by
allowing them to pull strings from the source comments formatted like:

    # KEYNAME: Some string...

This is probably the most familiar to people using lines like the following to
allow the L<Name section|Pod::Weaver::Section::Name> to determine a module's
abstract:

    # ABSTRACT: Provides the HypnoToad with mind-control powers

It will extract these strings by inspecting the C<ppi_document> which
must be given.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 PRIVATE METHODS

This role supplies only methods meant to be used internally by its consumer.

=head2 _extract_comment_content($ppi_doc, $key)

Given a key, try to find a comment matching C<# $key:> in the C<$ppi_document>
and return everything but the prefix.

e.g., given a document with a comment in it of the form:

    # ABSTRACT: Yada yada...

...and this is called...

    $self->_extract_comment_content($ppi, 'ABSTRACT')

...it returns to us:

    Yada yada...

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Role/Transformer.pm  view on Meta::CPAN

package Pod::Weaver::Role::Transformer 4.020;
# ABSTRACT: something that restructures a Pod5 document

use Moose::Role;
with 'Pod::Weaver::Role::Plugin';

use namespace::autoclean;

#pod =head1 IMPLEMENTING
#pod
#pod The Transformer role indicates that a plugin will be used to pre-process the input
#pod hashref's Pod document before weaving begins.  The plugin must provide a
#pod C<transform_document> method which will be called with the input Pod document.
#pod It is expected to modify the input in place.
#pod
#pod =cut

requires 'transform_document';

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Role::Transformer - something that restructures a Pod5 document

=head1 VERSION

version 4.020

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 IMPLEMENTING

The Transformer role indicates that a plugin will be used to pre-process the input
hashref's Pod document before weaving begins.  The plugin must provide a
C<transform_document> method which will be called with the input Pod document.
It is expected to modify the input in place.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Section/Authors.pm  view on Meta::CPAN

package Pod::Weaver::Section::Authors 4.020;
# ABSTRACT: a section listing authors

use Moose;
with 'Pod::Weaver::Role::Section';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use Pod::Elemental::Element::Nested;
use Pod::Elemental::Element::Pod5::Verbatim;

#pod =head1 OVERVIEW
#pod
#pod This section adds a listing of the documents authors.  It expects a C<authors>
#pod input parameter to be an arrayref of strings.  If no C<authors> parameter is
#pod given, it will do nothing.  Otherwise, it produces a hunk like this:
#pod
#pod   =head1 AUTHORS
#pod
#pod     Author One <a1@example.com>
#pod     Author Two <a2@example.com>
#pod
#pod =attr header
#pod
#pod The title of the header to be added.
#pod (default: "AUTHOR" or "AUTHORS")
#pod
#pod =cut

has header => (
  is  => 'ro',
  isa => 'Maybe[Str]',
);

sub weave_section {
  my ($self, $document, $input) = @_;

  return unless $input->{authors};

  my $multiple_authors = $input->{authors}->@* > 1;

  # I think I might like to have header be a callback or something, so that you
  # can get pluralization for your own custom header. -- rjbs, 2015-03-17
  my $name = $self->header || ($multiple_authors ? 'AUTHORS' : 'AUTHOR');

  $self->log_debug("adding $name section");
  $self->log_debug("author = $_") for $input->{authors}->@*;

  my $authors = [ map {
    Pod::Elemental::Element::Pod5::Ordinary->new({
      content => $_,
    }),
  } $input->{authors}->@* ];

  $authors = [
    Pod::Elemental::Element::Pod5::Command->new({
      command => 'over', content => '4',
    }),
    ( map {
      Pod::Elemental::Element::Pod5::Command->new({
        command => 'item', content => '*',
      }),
      $_,
    } @$authors ),
    Pod::Elemental::Element::Pod5::Command->new({
      command => 'back', content => '',
    }),
  ] if $multiple_authors;

  push $document->children->@*,
    Pod::Elemental::Element::Nested->new({
      type     => 'command',
      command  => 'head1',
      content  => $name,
      children => $authors,
    });
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Section::Authors - a section listing authors

=head1 VERSION

version 4.020

=head1 OVERVIEW

This section adds a listing of the documents authors.  It expects a C<authors>
input parameter to be an arrayref of strings.  If no C<authors> parameter is
given, it will do nothing.  Otherwise, it produces a hunk like this:

  =head1 AUTHORS

    Author One <a1@example.com>
    Author Two <a2@example.com>

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 header

The title of the header to be added.
(default: "AUTHOR" or "AUTHORS")

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Section/Bugs.pm  view on Meta::CPAN

package Pod::Weaver::Section::Bugs 4.020;
# ABSTRACT: a section for bugtracker info

use Moose;
use Text::Wrap ();
with 'Pod::Weaver::Role::Section';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

#pod =head1 OVERVIEW
#pod
#pod This section plugin will produce a hunk of Pod giving bug reporting
#pod information for the document, like this:
#pod
#pod   =head1 BUGS
#pod
#pod   Please report any bugs or feature requests on the bugtracker website
#pod   http://rt.cpan.org/Dist/Display.html?Queue=Pod-Weaver
#pod
#pod   When submitting a bug or request, please include a test-file or a
#pod   patch to an existing test-file that illustrates the bug or desired
#pod   feature.
#pod
#pod This plugin requires a C<distmeta> parameter containing a hash reference of
#pod L<CPAN::Meta::Spec> distribution metadata and at least one of one of the
#pod parameters C<web> or C<mailto> defined in
#pod C<< $meta->{resources}{bugtracker} >>.
#pod
#pod =head2 Using Pod::Weaver::Section::Bugs with Dist::Zilla
#pod
#pod When the PodWeaver plugin is used, the C<distmeta> parameter comes from the
#pod dist's distmeta data.  Since this section is skipped when no bugtracker data is
#pod in the distmeta, you'll need to make sure it's there.  A number of plugins set
#pod this data up automatically.  To manually configure your bugtracker data, you
#pod can add something like the following to C<dist.ini>:
#pod
#pod   [MetaResources]
#pod   bugtracker.web = http://rt.cpan.org/NoAuth/Bugs.html?Dist=Pod-Weaver-Example
#pod   bugtracker.mailto = bug-pod-weaver-example@rt.cpan.org
#pod
#pod   ; Perhaps add repository stuff here:
#pod   repository.url =
#pod   repository.web =
#pod   repository.type =
#pod
#pod   [PodWeaver]
#pod
#pod =attr header
#pod
#pod The title of the header to be added.
#pod (default: "BUGS")
#pod
#pod =cut

has header => (
  is      => 'ro',
  isa     => 'Str',
  default => 'BUGS',
);

sub weave_section {
  my ($self, $document, $input) = @_;

  unless (exists $input->{distmeta}{resources}{bugtracker}) {
    $self->log_debug('skipping section because there is no resources.bugtracker');
    return;
  }
  my $bugtracker = $input->{distmeta}{resources}{bugtracker};
  my ($web, $mailto) = $bugtracker->@{ qw(web mailto) };

  unless (defined $web || defined $mailto) {
    $self->log_debug('skipping section because there is no web or mailto key under resources.bugtracker');
    return;
  }

  my $text = "Please report any bugs or feature requests ";

  my $name = $self->header;
  if (defined $web) {
    $self->log_debug("including $web as bugtracker in $name section");
    $text .= "on the bugtracker website L<$web>";
    $text .= defined $mailto ? " or " : "\n";
  }

  if (defined $mailto) {
    $self->log_debug("including $mailto as bugtracker in $name section");
    $text .= "by email to L<$mailto|mailto:$mailto>\.\n";
  }

  local $Text::Wrap::huge = 'overflow';
  $text = Text::Wrap::wrap(q{}, q{}, $text);

  $text .= <<'HERE';

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.
HERE

  push $document->children->@*,
    Pod::Elemental::Element::Nested->new({
      command  => 'head1',
      content  => $name,
      children => [
        Pod::Elemental::Element::Pod5::Ordinary->new({ content => $text }),
      ],
    });
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Section::Bugs - a section for bugtracker info

=head1 VERSION

version 4.020

=head1 OVERVIEW

This section plugin will produce a hunk of Pod giving bug reporting
information for the document, like this:

  =head1 BUGS

  Please report any bugs or feature requests on the bugtracker website
  http://rt.cpan.org/Dist/Display.html?Queue=Pod-Weaver

  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.

This plugin requires a C<distmeta> parameter containing a hash reference of
L<CPAN::Meta::Spec> distribution metadata and at least one of one of the
parameters C<web> or C<mailto> defined in
C<< $meta->{resources}{bugtracker} >>.

=head2 Using Pod::Weaver::Section::Bugs with Dist::Zilla

When the PodWeaver plugin is used, the C<distmeta> parameter comes from the
dist's distmeta data.  Since this section is skipped when no bugtracker data is
in the distmeta, you'll need to make sure it's there.  A number of plugins set
this data up automatically.  To manually configure your bugtracker data, you
can add something like the following to C<dist.ini>:

  [MetaResources]
  bugtracker.web = http://rt.cpan.org/NoAuth/Bugs.html?Dist=Pod-Weaver-Example
  bugtracker.mailto = bug-pod-weaver-example@rt.cpan.org

  ; Perhaps add repository stuff here:
  repository.url =
  repository.web =
  repository.type =

  [PodWeaver]

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 header

The title of the header to be added.
(default: "BUGS")

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Section/Collect.pm  view on Meta::CPAN

package Pod::Weaver::Section::Collect 4.020;
# ABSTRACT: a section that gathers up specific commands

use Moose;
with 'Pod::Weaver::Role::Section',
     'Pod::Weaver::Role::Transformer';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

#pod =head1 OVERVIEW
#pod
#pod Given the configuration:
#pod
#pod   [Collect / METHODS]
#pod   command = method
#pod
#pod This plugin will start off by gathering and nesting any C<=method> commands
#pod found in the C<pod_document>.  Those commands, along with their nestable
#pod content, will be collected under a C<=head1 METHODS> header and placed in the
#pod correct location in the output stream.  Their order will be preserved as it was
#pod in the source document.
#pod
#pod =cut

use Pod::Elemental::Element::Pod5::Region;
use Pod::Elemental::Selectors -all;
use List::Util 1.33 'any';

#pod =attr command
#pod
#pod The command that will be collected (e.g. C<attr> or C<method>).
#pod (required)
#pod
#pod =attr new_command
#pod
#pod The command to be used in the output instead of the collected command.
#pod (default: C<head2>)
#pod
#pod =attr header_command
#pod
#pod The section command for the section to be added.
#pod (default: C<head1>)
#pod
#pod =attr header
#pod
#pod The title of the section to be added.
#pod (default: the plugin name)
#pod
#pod =cut

has command => (
  is  => 'ro',
  isa => 'Str',
  required => 1,
);

has new_command => (
  is  => 'ro',
  isa => 'Str',
  required => 1,
  default  => 'head2',
);

has header_command => (
  is  => 'ro',
  isa => 'Str',
  required => 1,
  default  => 'head1',
);

has header => (
  is  => 'ro',
  isa => 'Str',
  lazy     => 1,
  required => 1,
  default  => sub { $_[0]->plugin_name },
);

use Pod::Elemental::Transformer::Gatherer;
use Pod::Elemental::Transformer::Nester;

has __used_container => (is => 'rw');

sub transform_document {
  my ($self, $document) = @_;

  my $command = $self->command;
  my $selector = s_command($command);

  my $children = $document->children;
  unless (any { $selector->($_) } @$children) {
    $self->log_debug("no $command commands in pod to collect");
    return;
  }

  $self->log_debug("transforming $command commands into standard pod");

  my $nester = Pod::Elemental::Transformer::Nester->new({
     top_selector      => $selector,
     content_selectors => [
       s_command([ qw(head3 head4 over item back) ]),
       s_flat,
     ],
  });

  # try and find array position of suitable host
  my ( $container_id ) = grep {
    my $c = $children->[$_];
    $c->isa("Pod::Elemental::Element::Nested")
      and $c->command eq $self->header_command and $c->content eq $self->header;
  } 0 .. $#$children;

  my $container = $container_id
    ? splice @$children, $container_id, 1 # excise host
    : Pod::Elemental::Element::Nested->new({ # synthesize new host
        command => $self->header_command,
        content => $self->header,
      });

  $self->__used_container($container);

  my $gatherer = Pod::Elemental::Transformer::Gatherer->new({
    gather_selector => $selector,
    container       => $container,
  });

  $nester->transform_node($document);
  my @children = $container->children->@*; # rescue children
  $gatherer->transform_node($document); # insert host at position of first adopt-child and inject it with adopt-children
  foreach my $child ($container->children->@*) {
    $child->command( $self->new_command ) if $child->command eq $command;
  }
  unshift $container->children->@*, @children; # give original children back to host
}

sub weave_section {
  my ($self, $document, $input) = @_;

  return unless $self->__used_container;

  my $in_node = $input->{pod_document}->children;

  my @found = grep {
    my ($i, $para) = ($_, $in_node->[$_]);
    ($para == $self->__used_container)
      && $self->__used_container->children->@*;
  } (0 .. $#$in_node);

  push $document->children->@*, map { splice @$in_node, $_, 1 } reverse @found;
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Section::Collect - a section that gathers up specific commands

=head1 VERSION

version 4.020

=head1 OVERVIEW

Given the configuration:

  [Collect / METHODS]
  command = method

This plugin will start off by gathering and nesting any C<=method> commands
found in the C<pod_document>.  Those commands, along with their nestable
content, will be collected under a C<=head1 METHODS> header and placed in the
correct location in the output stream.  Their order will be preserved as it was
in the source document.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 command

The command that will be collected (e.g. C<attr> or C<method>).
(required)

=head2 new_command

The command to be used in the output instead of the collected command.
(default: C<head2>)

=head2 header_command

The section command for the section to be added.
(default: C<head1>)

=head2 header

The title of the section to be added.
(default: the plugin name)

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Section/GenerateSection.pm  view on Meta::CPAN

package Pod::Weaver::Section::GenerateSection 4.020;
# ABSTRACT: add pod section from an interpolated piece of text

use Moose;
with 'Pod::Weaver::Role::Section';

# BEGIN BOILERPLATE
use v5.20.0;
use warnings;
use utf8;
no feature 'switch';
use experimental qw(postderef postderef_qq); # This experiment gets mainlined.
# END BOILERPLATE

use Pod::Elemental::Element::Nested;
use Pod::Elemental::Element::Pod5::Ordinary;
use Text::Template;

use namespace::autoclean;

#pod =head1 SYNOPSIS
#pod
#pod In your F<weaver.ini>
#pod
#pod   [GenerateSection]
#pod   title = HOMEPAGE
#pod   text  = This is the POD for distribution {{$name}}. Check out what we have
#pod   text  = been up to at {{$homepage}}
#pod
#pod The title value can be omited if passed as the plugin name:
#pod
#pod   [GenerateSection / HOMEPAGE]
#pod
#pod =head1 DESCRIPTION
#pod
#pod This plugin allows the creation of simple text sections, with or without the
#pod use of Text::Template for templated text.
#pod
#pod The C<text> parameters become the lines of the template.
#pod
#pod The values of text are concatenated and variable names with matching values on
#pod the distribution are interpolated.  Specifying the heading level allows one to
#pod write down a rather long section of POD text without need for extra files. For
#pod example:
#pod
#pod   [GenerateSection / FEEDBACK]
#pod   head = 1
#pod   [GenerateSection / Reporting bugs]
#pod   head = 2
#pod   text = Please report bugs when you find them. While we do have a mailing
#pod   text = list, please use the bug tracker at {{$bugtracker_web}}
#pod   text = to report bugs
#pod   [GenerateSection / Homegape]
#pod   head = 2
#pod   text = Also, come check out our other projects at
#pod   text = {{$homepage}}
#pod
#pod =head1 TEMPLATE RENDERING
#pod
#pod When rendering as a template, the variables C<$plugin>, C<$dist>, and
#pod C<$distmeta> will be provided, set to the GenerateSection plugin,
#pod C<Dist::Zilla> object, and the distribution metadata hash respectively. For
#pod convenience, the following variables are also set:
#pod
#pod =for :list
#pod * C<< $name >>
#pod * C<< $version >>
#pod * C<< $homepage >>
#pod * C<< $repository_web >>
#pod * C<< $repository_url >>
#pod * C<< $bugtracker_web >>
#pod * C<< $bugtracker_email >>
#pod
#pod =attr text
#pod
#pod The text to be added to the section. Multiple values are allowed and will be
#pod concatenated. Certain sequences on the text will be replaced (see below).
#pod
#pod =cut

sub mvp_multivalue_args { return qw(text) }
has text => (
  is      => 'ro',
  isa     => 'ArrayRef',
  lazy    => 1,
  default => sub { [] },
);

#pod =attr head
#pod
#pod This is the I<X> to use in the C<=headX> that's created.  If it's C<0> then no
#pod heading is added.  It defaults to C<1>.
#pod
#pod =cut

has head => (
  is      => 'ro',
  isa     => 'Int',
  lazy    => 1,
  default => 1,
);

#pod =attr title
#pod
#pod The title for this section.  If none is given, the plugin's name is used.
#pod
#pod =cut

has title => (
  is      => 'ro',
  isa     => 'Str',
  lazy    => 1,
  default => sub { $_[0]->plugin_name },
);

#pod =attr main_module_only
#pod
#pod If true, this attribute indicates that only the main module's Pod should be
#pod altered.  By default, it is false.
#pod
#pod =cut

has main_module_only => (
  is      => 'ro',
  isa     => 'Bool',
  lazy    => 1,
  default => 0,
);

#pod =attr
#pod
#pod If true, the text is treated as a L<Text::Template> template and rendered.
#pod This attribute B<is true by default>.
#pod
#pod =cut

has is_template => (
  is      => 'ro',
  isa     => 'Bool',
  lazy    => 1,
  default => 1,
);

sub weave_section {
  my ($self, $document, $input) = @_;

  if ($self->main_module_only) {
    return if $input->{zilla}->main_module->name ne $input->{filename};
  }

  my $text = join ("\n", $self->text->@*);

  if ($self->is_template) {
    my %stash;

    if ($input->{zilla}) {
      %stash = (
        dist      => \($input->{zilla}),
        distmeta  => \($input->{distmeta}),
        plugin    => \($self),

        name        => $input->{distmeta}{name},
        version     => $input->{distmeta}{version},
        homepage    => $input->{distmeta}{resources}{homepage},
        repository_web   => $input->{distmeta}{resources}{repository}{web},
        repository_url   => $input->{distmeta}{resources}{repository}{url},
        bugtracker_web   => $input->{distmeta}{resources}{bugtracker}{web},
        bugtracker_email => $input->{distmeta}{resources}{bugtracker}{mailto},
      );
    }

    $text = $self->fill_in_string($text, \%stash);
  }

  my $element = Pod::Elemental::Element::Pod5::Ordinary->new({ content => $text });

  if ($self->head) {
    $element = Pod::Elemental::Element::Nested->new({
      command  => "head" . $self->head,
      content  => $self->title,
      children => [ $element ],
    });
  }

  push $document->children->@*, $element;
}

# BEGIN CODE IMPORTED FROM Dist::Zilla::Role::TextTemplate
#pod =attr delim
#pod
#pod If given, this must be an arrayref with two elements.  These will be the
#pod opening and closing delimiters of template variable sections.  By default they
#pod are C<{{> and C<}}>.
#pod
#pod =cut

has delim => (
  is   => 'ro',
  isa  => 'ArrayRef',
  lazy => 1,
  init_arg => undef,
  default  => sub { [ qw(  {{  }}  ) ] },
);

sub fill_in_string {
  my ($self, $string, $stash, $arg) = @_;

  $self->log_fatal("Cannot use undef as a template string")
    unless defined $string;

  my $tmpl = Text::Template->new(
    TYPE       => 'STRING',
    SOURCE     => $string,
    DELIMITERS => $self->delim,
    BROKEN     => sub { my %hash = @_; die $hash{error}; },
    %$arg,
  );

  $self->log_fatal("Could not create a Text::Template object from:\n$string")
    unless $tmpl;

  my $content = $tmpl->fill_in(%$arg, HASH => $stash);

  $self->log_fatal("Filling in the template returned undef for:\n$string")
    unless defined $content;

  return $content;
}
# END CODE IMPORTED FROM Dist::Zilla::Role::TextTemplate

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Section::GenerateSection - add pod section from an interpolated piece of text

=head1 VERSION

version 4.020

=head1 SYNOPSIS

In your F<weaver.ini>

  [GenerateSection]
  title = HOMEPAGE
  text  = This is the POD for distribution {{$name}}. Check out what we have
  text  = been up to at {{$homepage}}

The title value can be omited if passed as the plugin name:

  [GenerateSection / HOMEPAGE]

=head1 DESCRIPTION

This plugin allows the creation of simple text sections, with or without the
use of Text::Template for templated text.

The C<text> parameters become the lines of the template.

The values of text are concatenated and variable names with matching values on
the distribution are interpolated.  Specifying the heading level allows one to
write down a rather long section of POD text without need for extra files. For
example:

  [GenerateSection / FEEDBACK]
  head = 1
  [GenerateSection / Reporting bugs]
  head = 2
  text = Please report bugs when you find them. While we do have a mailing
  text = list, please use the bug tracker at {{$bugtracker_web}}
  text = to report bugs
  [GenerateSection / Homegape]
  head = 2
  text = Also, come check out our other projects at
  text = {{$homepage}}

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 text

The text to be added to the section. Multiple values are allowed and will be
concatenated. Certain sequences on the text will be replaced (see below).

=head2 head

This is the I<X> to use in the C<=headX> that's created.  If it's C<0> then no
heading is added.  It defaults to C<1>.

=head2 title

The title for this section.  If none is given, the plugin's name is used.

=head2 main_module_only

If true, this attribute indicates that only the main module's Pod should be
altered.  By default, it is false.

=head2

If true, the text is treated as a L<Text::Template> template and rendered.
This attribute B<is true by default>.

=head2 delim

If given, this must be an arrayref with two elements.  These will be the
opening and closing delimiters of template variable sections.  By default they
are C<{{> and C<}}>.

=head1 TEMPLATE RENDERING

When rendering as a template, the variables C<$plugin>, C<$dist>, and
C<$distmeta> will be provided, set to the GenerateSection plugin,
C<Dist::Zilla> object, and the distribution metadata hash respectively. For
convenience, the following variables are also set:

=over 4

=item *

C<< $name >>

=item *

C<< $version >>

=item *

C<< $homepage >>

=item *

C<< $repository_web >>

=item *

C<< $repository_url >>

=item *

C<< $bugtracker_web >>

=item *

C<< $bugtracker_email >>

=back

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut

lib/Pod/Weaver/Section/Generic.pm  view on Meta::CPAN

package Pod::Weaver::Section::Generic 4.020;
# ABSTRACT: a generic section, found by lifting sections

use Moose;
with 'Pod::Weaver::Role::Section';

use v5.20.0;
use experimental 'postderef'; # this experiment succeeded -- rjbs, 2021-04-02

#pod =head1 OVERVIEW
#pod
#pod This section will find and include a located hunk of Pod.  In general, it will
#pod find a C<=head1> command with a content of the plugin's name.
#pod
#pod In other words, if your configuration include:
#pod
#pod   [Generic]
#pod   header = OVERVIEW
#pod
#pod ...then this weaver will look for "=head1 OVERVIEW" and include it at the
#pod appropriate location in your output.
#pod
#pod Since you'll probably want to use Generic several times, and that will require
#pod giving each use a unique name, you can omit C<header> if you provide a
#pod plugin name, and it will default to the plugin name.  In other words, the
#pod configuration above could be specified just as:
#pod
#pod   [Generic / OVERVIEW]
#pod
#pod If the C<required> attribute is given, and true, then an exception will be
#pod raised if this section can't be found.
#pod
#pod =cut

use Pod::Elemental::Element::Pod5::Region;
use Pod::Elemental::Selectors -all;

#pod =attr required
#pod
#pod A boolean value specifying whether this section is required to be present or not. Defaults
#pod to false.
#pod
#pod If it's enabled and the section can't be found an exception will be raised.
#pod
#pod =cut

has required => (
  is  => 'ro',
  isa => 'Bool',
  default => 0,
);

#pod =attr header
#pod
#pod The name of this section. Defaults to the plugin name.
#pod
#pod =cut

has header => (
  is   => 'ro',
  isa  => 'Str',
  lazy => 1,
  default => sub { $_[0]->plugin_name },
);

has selector => (
  is  => 'ro',
  isa => 'CodeRef',
  lazy    => 1,
  default => sub {
    my ($self) = @_;
    return sub {
      return unless s_command(head1 => $_[0]);
      return unless $_[0]->content eq $self->header;
    };
  },
);

sub weave_section {
  my ($self, $document, $input) = @_;

  my $in_node = $input->{pod_document}->children;

  my @found = grep {
    $self->selector->($in_node->[$_]);
  } (0 .. $#$in_node);

  confess "Couldn't find required Generic section for " . $self->header . " in file "
    . (defined $input->{filename} ? $input->{filename} : '') if $self->required and not @found;

  $self->log_debug('adding ' . $self->header . ' back into pod');

  push $document->children->@*, map { splice @$in_node, $_, 1 } reverse @found;
}

__PACKAGE__->meta->make_immutable;
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Pod::Weaver::Section::Generic - a generic section, found by lifting sections

=head1 VERSION

version 4.020

=head1 OVERVIEW

This section will find and include a located hunk of Pod.  In general, it will
find a C<=head1> command with a content of the plugin's name.

In other words, if your configuration include:

  [Generic]
  header = OVERVIEW

...then this weaver will look for "=head1 OVERVIEW" and include it at the
appropriate location in your output.

Since you'll probably want to use Generic several times, and that will require
giving each use a unique name, you can omit C<header> if you provide a
plugin name, and it will default to the plugin name.  In other words, the
configuration above could be specified just as:

  [Generic / OVERVIEW]

If the C<required> attribute is given, and true, then an exception will be
raised if this section can't be found.

=head1 PERL VERSION

This module should work on any version of perl still receiving updates from
the Perl 5 Porters.  This means it should work on any version of perl
released in the last two to three years.  (That is, if the most recently
released version is v5.40, then this module should work on both v5.40 and
v5.38.)

Although it may work on older versions of perl, no guarantee is made that the
minimum required version will not be increased.  The version may be increased
for any reason, and there is no promise that patches will be accepted to
lower the minimum required perl.

=head1 ATTRIBUTES

=head2 required

A boolean value specifying whether this section is required to be present or not. Defaults
to false.

If it's enabled and the section can't be found an exception will be raised.

=head2 header

The name of this section. Defaults to the plugin name.

=head1 AUTHOR

Ricardo SIGNES <cpan@semiotic.systems>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Ricardo SIGNES.

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

=cut



( run in 0.876 second using v1.01-cache-2.11-cpan-b888b73be4d )