summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man1/perlnewmod.1
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man1/perlnewmod.1')
-rw-r--r--upstream/mageia-cauldron/man1/perlnewmod.1319
1 files changed, 319 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man1/perlnewmod.1 b/upstream/mageia-cauldron/man1/perlnewmod.1
new file mode 100644
index 00000000..315343bb
--- /dev/null
+++ b/upstream/mageia-cauldron/man1/perlnewmod.1
@@ -0,0 +1,319 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "PERLNEWMOD 1"
+.TH PERLNEWMOD 1 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+perlnewmod \- preparing a new module for distribution
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+This document gives you some suggestions about how to go about writing
+Perl modules, preparing them for distribution, and making them available
+via CPAN.
+.PP
+One of the things that makes Perl really powerful is the fact that Perl
+hackers tend to want to share the solutions to problems they've faced,
+so you and I don't have to battle with the same problem again.
+.PP
+The main way they do this is by abstracting the solution into a Perl
+module. If you don't know what one of these is, the rest of this
+document isn't going to be much use to you. You're also missing out on
+an awful lot of useful code; consider having a look at perlmod,
+perlmodlib and perlmodinstall before coming back here.
+.PP
+When you've found that there isn't a module available for what you're
+trying to do, and you've had to write the code yourself, consider
+packaging up the solution into a module and uploading it to CPAN so that
+others can benefit.
+.PP
+You should also take a look at perlmodstyle for best practices in
+making a module.
+.SS Warning
+.IX Subsection "Warning"
+We're going to primarily concentrate on Perl-only modules here, rather
+than XS modules. XS modules serve a rather different purpose, and
+you should consider different things before distributing them \- the
+popularity of the library you are gluing, the portability to other
+operating systems, and so on. However, the notes on preparing the Perl
+side of the module and packaging and distributing it will apply equally
+well to an XS module as a pure-Perl one.
+.SS "What should I make into a module?"
+.IX Subsection "What should I make into a module?"
+You should make a module out of any code that you think is going to be
+useful to others. Anything that's likely to fill a hole in the communal
+library and which someone else can slot directly into their program. Any
+part of your code which you can isolate and extract and plug into
+something else is a likely candidate.
+.PP
+Let's take an example. Suppose you're reading in data from a local
+format into a hash-of-hashes in Perl, turning that into a tree, walking
+the tree and then piping each node to an Acme Transmogrifier Server.
+.PP
+Now, quite a few people have the Acme Transmogrifier, and you've had to
+write something to talk the protocol from scratch \- you'd almost
+certainly want to make that into a module. The level at which you pitch
+it is up to you: you might want protocol-level modules analogous to
+Net::SMTP which then talk to higher level modules analogous
+to Mail::Send. The choice is yours, but you do want to get
+a module out for that server protocol.
+.PP
+Nobody else on the planet is going to talk your local data format, so we
+can ignore that. But what about the thing in the middle? Building tree
+structures from Perl variables and then traversing them is a nice,
+general problem, and if nobody's already written a module that does
+that, you might want to modularise that code too.
+.PP
+So hopefully you've now got a few ideas about what's good to modularise.
+Let's now see how it's done.
+.SS "Step-by-step: Preparing the ground"
+.IX Subsection "Step-by-step: Preparing the ground"
+Before we even start scraping out the code, there are a few things we'll
+want to do in advance.
+.IP "Look around" 3
+.IX Item "Look around"
+Dig into a bunch of modules to see how they're written. I'd suggest
+starting with Text::Tabs, since it's in the standard
+library and is nice and simple, and then looking at something a little
+more complex like File::Copy. For object oriented
+code, WWW::Mechanize or the \f(CW\*(C`Email::*\*(C'\fR modules provide some good
+examples.
+.Sp
+These should give you an overall feel for how modules are laid out and
+written.
+.IP "Check it's new" 3
+.IX Item "Check it's new"
+There are a lot of modules on CPAN, and it's easy to miss one that's
+similar to what you're planning on contributing. Have a good plough
+through <https://metacpan.org> and make sure you're not the one
+reinventing the wheel!
+.IP "Discuss the need" 3
+.IX Item "Discuss the need"
+You might love it. You might feel that everyone else needs it. But there
+might not actually be any real demand for it out there. If you're unsure
+about the demand your module will have, consider asking the
+\&\f(CW\*(C`module\-authors@perl.org\*(C'\fR mailing list (send an email to
+\&\f(CW\*(C`module\-authors\-subscribe@perl.org\*(C'\fR to subscribe; see
+<https://lists.perl.org/list/module\-authors.html> for more information
+and a link to the archives).
+.IP "Choose a name" 3
+.IX Item "Choose a name"
+Perl modules included on CPAN have a naming hierarchy you should try to
+fit in with. See perlmodlib for more details on how this works, and
+browse around CPAN and the modules list to get a feel of it. At the very
+least, remember this: modules should be title capitalised, (This::Thing)
+fit in with a category, and explain their purpose succinctly.
+.IP "Check again" 3
+.IX Item "Check again"
+While you're doing that, make really sure you haven't missed a module
+similar to the one you're about to write.
+.Sp
+When you've got your name sorted out and you're sure that your module is
+wanted and not currently available, it's time to start coding.
+.SS "Step-by-step: Making the module"
+.IX Subsection "Step-by-step: Making the module"
+.IP "Start with \fImodule-starter\fR or \fIh2xs\fR" 3
+.IX Item "Start with module-starter or h2xs"
+The \fImodule-starter\fR utility is distributed as part of the
+Module::Starter CPAN package. It creates a directory
+with stubs of all the necessary files to start a new module, according
+to recent "best practice" for module development, and is invoked from
+the command line, thus:
+.Sp
+.Vb 2
+\& module\-starter \-\-module=Foo::Bar \e
+\& \-\-author="Your Name" \-\-email=yourname@cpan.org
+.Ve
+.Sp
+If you do not wish to install the Module::Starter
+package from CPAN, \fIh2xs\fR is an older tool, originally intended for the
+development of XS modules, which comes packaged with the Perl
+distribution.
+.Sp
+A typical invocation of h2xs for a pure Perl module is:
+.Sp
+.Vb 1
+\& h2xs \-AX \-\-skip\-exporter \-\-use\-new\-tests \-n Foo::Bar
+.Ve
+.Sp
+The \f(CW\*(C`\-A\*(C'\fR omits the Autoloader code, \f(CW\*(C`\-X\*(C'\fR omits XS elements,
+\&\f(CW\*(C`\-\-skip\-exporter\*(C'\fR omits the Exporter code, \f(CW\*(C`\-\-use\-new\-tests\*(C'\fR sets up a
+modern testing environment, and \f(CW\*(C`\-n\*(C'\fR specifies the name of the module.
+.IP "Use strict and warnings" 3
+.IX Item "Use strict and warnings"
+A module's code has to be warning and strict-clean, since you can't
+guarantee the conditions that it'll be used under. Besides, you wouldn't
+want to distribute code that wasn't warning or strict-clean anyway,
+right?
+.IP "Use Carp" 3
+.IX Item "Use Carp"
+The Carp module allows you to present your error messages from
+the caller's perspective; this gives you a way to signal a problem with
+the caller and not your module. For instance, if you say this:
+.Sp
+.Vb 1
+\& warn "No hostname given";
+.Ve
+.Sp
+the user will see something like this:
+.Sp
+.Vb 2
+\& No hostname given at
+\& /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm line 123.
+.Ve
+.Sp
+which looks like your module is doing something wrong. Instead, you want
+to put the blame on the user, and say this:
+.Sp
+.Vb 1
+\& No hostname given at bad_code, line 10.
+.Ve
+.Sp
+You do this by using Carp and replacing your \f(CW\*(C`warn\*(C'\fRs with
+\&\f(CW\*(C`carp\*(C'\fRs. If you need to \f(CW\*(C`die\*(C'\fR, say \f(CW\*(C`croak\*(C'\fR instead. However, keep
+\&\f(CW\*(C`warn\*(C'\fR and \f(CW\*(C`die\*(C'\fR in place for your sanity checks \- where it really is
+your module at fault.
+.IP "Use Exporter \- wisely!" 3
+.IX Item "Use Exporter - wisely!"
+Exporter gives you a standard way of exporting symbols and
+subroutines from your module into the caller's namespace. For instance,
+saying \f(CW\*(C`use Net::Acme qw(&frob)\*(C'\fR would import the \f(CW\*(C`frob\*(C'\fR subroutine.
+.Sp
+The package variable \f(CW@EXPORT\fR will determine which symbols will get
+exported when the caller simply says \f(CW\*(C`use Net::Acme\*(C'\fR \- you will hardly
+ever want to put anything in there. \f(CW@EXPORT_OK\fR, on the other hand,
+specifies which symbols you're willing to export. If you do want to
+export a bunch of symbols, use the \f(CW%EXPORT_TAGS\fR and define a standard
+export set \- look at Exporter for more details.
+.IP "Use plain old documentation" 3
+.IX Item "Use plain old documentation"
+The work isn't over until the paperwork is done, and you're going to
+need to put in some time writing some documentation for your module.
+\&\f(CW\*(C`module\-starter\*(C'\fR or \f(CW\*(C`h2xs\*(C'\fR will provide a stub for you to fill in; if
+you're not sure about the format, look at perlpod for an
+introduction. Provide a good synopsis of how your module is used in
+code, a description, and then notes on the syntax and function of the
+individual subroutines or methods. Use Perl comments for developer notes
+and POD for end-user notes.
+.IP "Write tests" 3
+.IX Item "Write tests"
+You're encouraged to create self-tests for your module to ensure it's
+working as intended on the myriad platforms Perl supports; if you upload
+your module to CPAN, a host of testers will build your module and send
+you the results of the tests. Again, \f(CW\*(C`module\-starter\*(C'\fR and \f(CW\*(C`h2xs\*(C'\fR
+provide a test framework which you can extend \- you should do something
+more than just checking your module will compile.
+Test::Simple and Test::More are good
+places to start when writing a test suite.
+.IP "Write the \fIREADME\fR" 3
+.IX Item "Write the README"
+If you're uploading to CPAN, the automated gremlins will extract the
+README file and place that in your CPAN directory. It'll also appear in
+the main \fIby-module\fR and \fIby-category\fR directories if you make it onto
+the modules list. It's a good idea to put here what the module actually
+does in detail.
+.IP "Write \fIChanges\fR" 3
+.IX Item "Write Changes"
+Add any user-visible changes since the last release to your \fIChanges\fR
+file.
+.SS "Step-by-step: Distributing your module"
+.IX Subsection "Step-by-step: Distributing your module"
+.IP "Get a CPAN user ID" 3
+.IX Item "Get a CPAN user ID"
+Every developer publishing modules on CPAN needs a CPAN ID. Visit
+\&\f(CW\*(C`<https://pause.perl.org/>\*(C'\fR, select "Request PAUSE Account", and wait for
+your request to be approved by the PAUSE administrators.
+.IP "Make the tarball" 3
+.IX Item "Make the tarball"
+Once again, \f(CW\*(C`module\-starter\*(C'\fR or \f(CW\*(C`h2xs\*(C'\fR has done all the work for you.
+They produce the standard \f(CW\*(C`Makefile.PL\*(C'\fR you see when you download and
+install modules, and this produces a Makefile with a \f(CW\*(C`dist\*(C'\fR target.
+.Sp
+.Vb 1
+\& perl Makefile.PL && make test && make distcheck && make dist
+.Ve
+.Sp
+Once you've ensured that your module passes its own tests \- always a
+good thing to make sure \- you can \f(CW\*(C`make distcheck\*(C'\fR to make sure
+everything looks OK, followed by \f(CW\*(C`make dist\*(C'\fR, and the Makefile will
+hopefully produce you a nice tarball of your module, ready for upload.
+.IP "Upload the tarball" 3
+.IX Item "Upload the tarball"
+The email you got when you received your CPAN ID will tell you how to
+log in to PAUSE, the Perl Authors Upload SErver. From the menus there,
+you can upload your module to CPAN.
+.Sp
+Alternatively you can use the \fIcpan-upload\fR script, part of the
+CPAN::Uploader distribution on CPAN.
+.IP "Fix bugs!" 3
+.IX Item "Fix bugs!"
+Once you start accumulating users, they'll send you bug reports. If
+you're lucky, they'll even send you patches. Welcome to the joys of
+maintaining a software project...
+.SH AUTHOR
+.IX Header "AUTHOR"
+Simon Cozens, \f(CW\*(C`simon@cpan.org\*(C'\fR
+.PP
+Updated by Kirrily "Skud" Robert, \f(CW\*(C`skud@cpan.org\*(C'\fR
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+perlmod, perlmodlib, perlmodinstall, h2xs, strict,
+Carp, Exporter, perlpod, Test::Simple, Test::More
+ExtUtils::MakeMaker, Module::Build, Module::Starter
+<https://www.cpan.org/>