SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Pod::Weaver
Module author: Ricardo Signes
Talk author: Joshua Keroes
Date: 13 Sep 2012
Who likes to write
documentation?




           http://www.flickr.com/photos/bensonkua/2687804310/

                                                           2
What sucks about
documentation?




                   3
What sucks about
documentation?
It violates the DRY rule.




                            3
What sucks about
documentation?
It violates the DRY rule.




                            3
What else sucks?




                   4
What else sucks?

POD is too verbose.

=head1 FUNCTIONS

=over

=item frowny()

Returns a frowny face.

=back
                         4
What else sucks?
Let it all out.
=head1 COPYRIGHT AND LICENSE


Copyright (c) 1901 Fergie T. Sumtin.
All rights reserved.




                                       5
Templates to the rescue




                          6
Templates to the rescue

POD::Weaver uses a template.
It’s called weaver.ini.




                               6
weaver.ini [@Default]
 [@Default]




                        7
weaver.ini [@Default]
 [@CorePrep]            [Collect /
                        ATTRIBUTES]
                        command = attr
 [Name]
                        [Collect / METHODS]
 [Version]
                        command = method
 [Region  / prelude]
 [Generic / SYNOPSIS]
 [Generic /
 DESCRIPTION]           [Leftovers]
 [Generic / OVERVIEW]   [Region  / postlude]
                        [Authors]              8
weaver.ini [@Default]
 [EnsurePod5]           [Collect /
                        ATTRIBUTES]
 [H1Nester]
                        command = attr
 [Name]
                        [Collect / METHODS]
 [Version]
                        command = method
 [Region  / prelude]
 [Generic / SYNOPSIS]
 [Generic /
 DESCRIPTION]           [Leftovers]
 [Generic / OVERVIEW]   [Region  / postlude]
                        [Authors]              9
weaver.ini [@Default]
 [EnsurePod5]           [Collect /
                        ATTRIBUTES]
 [H1Nester]
                        command = attr
 [Name]
                        [Collect / METHODS]
 [Version]
                        command = method
 [Region  / prelude]
                        [Collect / FUNCTIONS]
 [Generic / SYNOPSIS]
                        command = func
 [Generic /
 DESCRIPTION]           [Leftovers]
 [Generic / OVERVIEW]   [Region  / postlude]
                        [Authors]               10
weaver.ini [@Default]
 [EnsurePod5]           [Collect /
                        ATTRIBUTES]
 [H1Nester]
                        command = attr
 [Name]
                        [Collect / METHODS]
 [Version]
                        command = method
 [Region  / prelude]
                        [Collect / FUNCTIONS]
 [Generic / SYNOPSIS]
                        command = func
 [Generic /
 DESCRIPTION]           [Leftovers]
 [Generic / OVERVIEW]   [Region  / postlude]
                        [Authors]               11
[NAME]

=head1 NAME
Some::Package::Name - just a package




                                       12
[NAME]

=head1 NAME
Some::Package::Name - just a package


# PODNAME: Some::Package::Name
# ABSTRACT: just a package




                                       13
[NAME]

=head1 NAME
Some::Package::Name - just a package


package Some::Package::Name
# ABSTRACT: just a package




                                       14
[VERSION]

=head1 VERSION
version 1.234




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

=head1 SYNOPSIS
  my $p = Some::Package::Name->new;
  say $p;

=head1 DESCRIPTION
A module that knows it’s own package name.

                                             16
[Collect / FUNCTIONS]
command = func
=head1 FUNCTIONS
=over
=item binge()
eats arguments
=item purge()
returns eaten args
=back


                        17
[Collect / FUNCTIONS]
command = func
=head1 FUNCTIONS
=over
=item binge()        =func binge()
eats arguments       eats arguments
=item purge()        =func purge()
returns eaten args   returns eaten args
=back


                                          18
[Collect / METHODS]
command = method
=head1 METHODS
=over
=item new()
creates an object
=item spawn()
spawns an object
=back


                      19
[Collect / METHODS]
command = method
=head1 METHODS
=over
=item new()         =method new()
creates an object   creates an object
=item spawn()       =method spawn()
spawns an object    spawns an object
=back


                                        20
[Collect / ATTRIBUTES]
command = attr
=head1 ATTRIBUTES
=over
=item torches()
number of torches
=item matches()
number of matches
=back


                         21
[Collect / ATTRIBUTES]
command = attr
=head1 ATTRIBUTES
=over
=item torches()     =attr torches()
number of torches   number of torches
=item matches()     =attr matches()
number of matches   number of matches
=back


                                        22
[Region / prelude]


 =begin :prelude   weaver.ini

 …                 [Name]

 =end :prelude     [Version]

                   [Region     / prelude]

 =for :prelude …   [Generic / SYNOPSIS]

                   [Generic / DESCRIPTION]

                   …

                                             23
[Leftovers]


 =head1 SUPPORT           weaver.ini

 For support, please      …
 send a self-addressed,
 stamped envelope to:     [Leftovers]

   Joshua Keroes          [Region / postlude]

   Somewhere in           [Authors]

   Portland, OR           [Legal]



                                                24
[Region / postlude]


 =begin :postlude   weaver.ini

 …                  …

 =end :postlude     [Leftovers]

                    [Region / postlude]

 =for :postlude …   [Authors]

                    [Legal]



                                          25
[Authors]

 =head1 AUTHORS          weaver.ini
 Colette O’Day           …
 <colette@example.com>
                         [Leftovers]
                         [Region / postlude]
                         [Authors]
                         [Legal]




                                               26
[Legal]

 =head1 COPYRIGHT AND LICENSE

 This software is copyright (c) 2012 by Joshua
 Keroes.

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




                                                  27
Let’s sum up.



                28
Leaner POD

No more NAME
No more VERSION
No more AUTHORS
No more COPYRIGHT AND LICENSE




                                29
Leaner POD

Cleaner subroutine definitions
  =func
  =method
  =attr




                                30
Beyond @Default
Lists, the lazy way

 weaver.ini
 [@Default]
 [-Transformer]
 transformer = List




                      32
Lists

 =head1 SEE ALSO
 =over 4
 =item *
 L<Your::Module>
 =item *
 L<Your::Package>
 =back


                    33
Pod::Weaver bullet lists

 =head1 SEE ALSO    =head1 SEE ALSO
 =over 4
 =item *            =for :list
 L<Your::Module>    * L<Your::Module>
 =item *            * L<Your::Package>
 L<Your::Package>
 =back


                                         34
Pod::Weaver numeric lists

=head1 SEE ALSO    =head1 SEE ALSO
=over 4
=item *            =for :list
L<Your::Module>    1. L<Your::Module>
=item *            1. L<Your::Package>
L<Your::Package>
=back


                                         35
Pod::Weaver frontends



                        36
Dist::Zilla

 dist.ini
 [PodWeaver]
 …




               37
App::podweaver

Great for troubleshooting; bypassing Dist::Zilla
podweaver lib/path/to/file.pm




                                                   38
References

This talk at SlideShare: http://xrl.us/jkeroespw
Dist::Zilla + Pod::Weaver http://xrl.us/dzilpw
What is Pod::Weaver 1? http://xrl.us/rjbspw1
What is POD::Weaver 2? http://xrl.us/rjbspw2
Falling in love with Pod::Weaver http://xrl.us/lovepw




                                                        39

Weitere ähnliche Inhalte

Was ist angesagt?

DPC 2012 : PHP in the Dark Workshop
DPC 2012 : PHP in the Dark WorkshopDPC 2012 : PHP in the Dark Workshop
DPC 2012 : PHP in the Dark Workshop
Jeroen Keppens
 
Alessandro sf 2010
Alessandro sf 2010Alessandro sf 2010
Alessandro sf 2010
Puppet
 
Python utan-stodhjul-motorsag
Python utan-stodhjul-motorsagPython utan-stodhjul-motorsag
Python utan-stodhjul-motorsag
niklal
 
第二讲 预备-Python基礎
第二讲 预备-Python基礎第二讲 预备-Python基礎
第二讲 预备-Python基礎
anzhong70
 
Functional Pattern Matching on Python
Functional Pattern Matching on PythonFunctional Pattern Matching on Python
Functional Pattern Matching on Python
Daker Fernandes
 

Was ist angesagt? (17)

Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011
 
Introducción rápida a SQL
Introducción rápida a SQLIntroducción rápida a SQL
Introducción rápida a SQL
 
Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4
 
DPC 2012 : PHP in the Dark Workshop
DPC 2012 : PHP in the Dark WorkshopDPC 2012 : PHP in the Dark Workshop
DPC 2012 : PHP in the Dark Workshop
 
Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010
 
Alessandro sf 2010
Alessandro sf 2010Alessandro sf 2010
Alessandro sf 2010
 
Python utan-stodhjul-motorsag
Python utan-stodhjul-motorsagPython utan-stodhjul-motorsag
Python utan-stodhjul-motorsag
 
Phishing for Root (How I Got Access to Root on Your Computer With 8 Seconds o...
Phishing for Root (How I Got Access to Root on Your Computer With 8 Seconds o...Phishing for Root (How I Got Access to Root on Your Computer With 8 Seconds o...
Phishing for Root (How I Got Access to Root on Your Computer With 8 Seconds o...
 
第二讲 Python基礎
第二讲 Python基礎第二讲 Python基礎
第二讲 Python基礎
 
第二讲 预备-Python基礎
第二讲 预备-Python基礎第二讲 预备-Python基礎
第二讲 预备-Python基礎
 
Functional Pattern Matching on Python
Functional Pattern Matching on PythonFunctional Pattern Matching on Python
Functional Pattern Matching on Python
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
Migrating to Puppet 4.0
Migrating to Puppet 4.0Migrating to Puppet 4.0
Migrating to Puppet 4.0
 
Hidden treasures of Ruby
Hidden treasures of RubyHidden treasures of Ruby
Hidden treasures of Ruby
 
Shell实现的windows回收站功能的脚本
Shell实现的windows回收站功能的脚本Shell实现的windows回收站功能的脚本
Shell实现的windows回收站功能的脚本
 
Ruby to Elixir - what's great and what you might miss
Ruby to Elixir - what's great and what you might missRuby to Elixir - what's great and what you might miss
Ruby to Elixir - what's great and what you might miss
 
extending-php
extending-phpextending-php
extending-php
 

Andere mochten auch (8)

Hank Torbert Avondale Ventures
Hank Torbert Avondale VenturesHank Torbert Avondale Ventures
Hank Torbert Avondale Ventures
 
Have more fun with Perl via Questhub
Have more fun with Perl via QuesthubHave more fun with Perl via Questhub
Have more fun with Perl via Questhub
 
CPAN Curation
CPAN CurationCPAN Curation
CPAN Curation
 
Lecture19-20
Lecture19-20Lecture19-20
Lecture19-20
 
CPAN Exporter modules for Perl 5
CPAN Exporter modules for Perl 5CPAN Exporter modules for Perl 5
CPAN Exporter modules for Perl 5
 
Dist::Zilla - A very brief introduction
Dist::Zilla - A very brief introductionDist::Zilla - A very brief introduction
Dist::Zilla - A very brief introduction
 
Co-teaching can be wonderful !
Co-teaching can be wonderful !Co-teaching can be wonderful !
Co-teaching can be wonderful !
 
Hank torbert
Hank torbertHank torbert
Hank torbert
 

Ähnlich wie Getting started with Pod::Weaver

Unix Shell Scripting Basics
Unix Shell Scripting BasicsUnix Shell Scripting Basics
Unix Shell Scripting Basics
Sudharsan S
 
Introducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyIntroducing Command Line Applications with Ruby
Introducing Command Line Applications with Ruby
Nikhil Mungel
 

Ähnlich wie Getting started with Pod::Weaver (20)

Python于Web 2.0网站的应用 - QCon Beijing 2010
Python于Web 2.0网站的应用 - QCon Beijing 2010Python于Web 2.0网站的应用 - QCon Beijing 2010
Python于Web 2.0网站的应用 - QCon Beijing 2010
 
Chef for beginners module 2
Chef for beginners   module 2Chef for beginners   module 2
Chef for beginners module 2
 
Course 102: Lecture 8: Composite Commands
Course 102: Lecture 8: Composite Commands Course 102: Lecture 8: Composite Commands
Course 102: Lecture 8: Composite Commands
 
Unix shell scripting basics
Unix shell scripting basicsUnix shell scripting basics
Unix shell scripting basics
 
Linux class 8 tar
Linux class 8   tar  Linux class 8   tar
Linux class 8 tar
 
Devel::hdb debugger talk
Devel::hdb debugger talkDevel::hdb debugger talk
Devel::hdb debugger talk
 
groovy & grails - lecture 2
groovy & grails - lecture 2groovy & grails - lecture 2
groovy & grails - lecture 2
 
Configuration surgery with Augeas (OggCamp 12)
Configuration surgery with Augeas (OggCamp 12)Configuration surgery with Augeas (OggCamp 12)
Configuration surgery with Augeas (OggCamp 12)
 
Introduction to Functional Programming
Introduction to Functional ProgrammingIntroduction to Functional Programming
Introduction to Functional Programming
 
Ansible for Beginners
Ansible for BeginnersAnsible for Beginners
Ansible for Beginners
 
(Practical) linux 104
(Practical) linux 104(Practical) linux 104
(Practical) linux 104
 
Unix Shell Scripting Basics
Unix Shell Scripting BasicsUnix Shell Scripting Basics
Unix Shell Scripting Basics
 
Tame your Infrastructure with Puppet
Tame your Infrastructure with PuppetTame your Infrastructure with Puppet
Tame your Infrastructure with Puppet
 
Introducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyIntroducing Command Line Applications with Ruby
Introducing Command Line Applications with Ruby
 
Install Archlinux in 10 Steps (Sort of) :)
Install Archlinux in 10 Steps (Sort of) :)Install Archlinux in 10 Steps (Sort of) :)
Install Archlinux in 10 Steps (Sort of) :)
 
The Grand Puppet Sub-Systems Tour - Nicholas Fagerlund, Puppet Labs
The Grand Puppet Sub-Systems Tour - Nicholas Fagerlund, Puppet LabsThe Grand Puppet Sub-Systems Tour - Nicholas Fagerlund, Puppet Labs
The Grand Puppet Sub-Systems Tour - Nicholas Fagerlund, Puppet Labs
 
Linux Basic Commands
Linux Basic CommandsLinux Basic Commands
Linux Basic Commands
 
Python Part 1
Python Part 1Python Part 1
Python Part 1
 
OpenWRT guide and memo
OpenWRT guide and memoOpenWRT guide and memo
OpenWRT guide and memo
 
File::CleanupTask
File::CleanupTaskFile::CleanupTask
File::CleanupTask
 

Kürzlich hochgeladen

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Kürzlich hochgeladen (20)

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 

Getting started with Pod::Weaver

Hinweis der Redaktion

  1. \n
  2. Show of hands and wild cheering please.\n(If &gt;1: hire this champ)\n(If 0: typical. Fortunately, Pod::Weaver can help)\n\n
  3. Why don&amp;#x2019;t we like to write docs?\nDRY. Heck, we already wrote the code, right?\nBeyond that, every module file in every module must have a NAME section. And an ABSTRACT. And they should have a COPYRIGHT, LICENSE, and AUTHOR(s), too. There&amp;#x2019;s a lot of repeated effort.\n
  4. Why don&amp;#x2019;t we like to write docs?\nDRY. Heck, we already wrote the code, right?\nBeyond that, every module file in every module must have a NAME section. And an ABSTRACT. And they should have a COPYRIGHT, LICENSE, and AUTHOR(s), too. There&amp;#x2019;s a lot of repeated effort.\n
  5. Should we really have to start a FUNCTIONS section? Is it a head1 or a head2? Why do we have to indent? Or remember to stop indenting, for that matter? And what if we want to intermingle POD with code?\n
  6. Should we really have to start a FUNCTIONS section? Is it a head1 or a head2? Why do we have to indent? Or remember to stop indenting, for that matter? And what if we want to intermingle POD with code?\n
  7. Why should you have to keep the copyright current? Honestly, we have a computer here.\n\n
  8. Know what Perl&apos;s good at? Templating. Just count the number of template-related modules on CPAN. viz. http://mapofcpan.org/\n
  9. weaver.ini is the template. Let&amp;#x2019;s take unwrap things a few levels. Default is a Pod::Weaver::PluginBundle::Default. The @-sign means PluginBundle instead of Plugin.\n
  10. Let&amp;#x2019;s unwrap the CorePrep PluginBundle\n
  11. Validate POD and make sure all sub-elements are nested under =head1&amp;#x2019;s. Good housekeeping, basically.\n
  12. Undocumented treasure!\n
  13. voila, the whole default template. Barring the two housekeeping plugins, the rest are in order. Let&amp;#x2019;s figure out what they do.\n
  14. \n
  15. Admittedly, this takes more typing. Fortunately, we can do better.\n
  16. You need either a PODNAME or a package. The rule of thumb is to use PODNAME for programs and to package for modules.\n
  17. Automatic and painless. podweaver gets it from a META.json or META.yml file. Under dzil, it depends which plugins are loaded in dist.ini, but that&amp;#x2019;s getting ahead of things.\n
  18. Think of the GENERIC plugin as a pass-through. These three sections, named above, and their contents will pass through P::W relatively unharmed.\n
  19. The collect plugin fetches and assembles sets of things. \n
  20. PW will add the section header and add the indenting; we just list the functions and what they do.\n
  21. The method collection uses the new =method keyword....\n
  22. \n
  23. Like Moose, Mouse, Moo, or Mo? =attr behaves just like the other collects. As with the other examples... Speaking of which, there are two plugins on CPAN you may find useful, one that adds an EXTENDS section; the other a CONSUMES section for Moose roles.\n
  24. the shorthand on the right will generate the POD on the left.\n
  25. Do you want to add generic/text before the synopsis? Text found here between a preludes =begin and =end or after a =for will be moved to the prelude location. This has to be generic text. I wasn&amp;#x2019;t able to add commands like =head1 successfully. We&amp;#x2019;ll look at another section that can handle this shortly.\n
  26. Leftovers come before the postlude region. \n
  27. Just like the prelude, the postlude will move generic/text after the leftovers.\n
  28. Automatic. podweaver gets it from META.json or META.yml. Under dzil, it depends which plugins are loaded in dist.ini.\n
  29. Automatic. podweaver gets it from META.json or META.yml. Under dzil, it depends which plugins are loaded in dist.ini.\n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. The numbers start at one and are auto-incremented.\n
  38. \n
  39. Add one line to run Pod::weaver during `dzil build`.\n
  40. \n
  41. \n