/usr/share/perl5/pod
NameSizeModeActions
perl.pod166670644editdlrm
perl56delta.pod1072010644editdlrm
perl58delta.pod1151650644editdlrm
perl561delta.pod1247130644editdlrm
perl581delta.pod380600644editdlrm
perl582delta.pod44700644editdlrm
perl583delta.pod63350644editdlrm
perl584delta.pod73630644editdlrm
perl585delta.pod58890644editdlrm
perl586delta.pod46510644editdlrm
perl587delta.pod83570644editdlrm
perl588delta.pod252810644editdlrm
perl589delta.pod539040644editdlrm
perl5004delta.pod562400644editdlrm
perl5005delta.pod342830644editdlrm
perl5100delta.pod555330644editdlrm
perl5101delta.pod438880644editdlrm
perl5120delta.pod892710644editdlrm
perl5121delta.pod101410644editdlrm
perl5122delta.pod96030644editdlrm
perl5123delta.pod41000644editdlrm
perl5124delta.pod36720644editdlrm
perl5125delta.pod76830644editdlrm
perl5140delta.pod1443250644editdlrm
perl5141delta.pod79660644editdlrm
perl5142delta.pod68920644editdlrm
perl5143delta.pod77600644editdlrm
perl5144delta.pod63270644editdlrm
perl5160delta.pod1336510644editdlrm
perl5161delta.pod61420644editdlrm
perl5162delta.pod35940644editdlrm
perl5163delta.pod40850644editdlrm
perl5180delta.pod1194290644editdlrm
perl5181delta.pod65970644editdlrm
perl5182delta.pod53350644editdlrm
perl5184delta.pod46420644editdlrm
perl5200delta.pod1156980644editdlrm
perl5201delta.pod108990644editdlrm
perl5202delta.pod125090644editdlrm
perl5203delta.pod93920644editdlrm
perl5220delta.pod1309630644editdlrm
perl5221delta.pod107670644editdlrm
perl5222delta.pod126290644editdlrm
perl5223delta.pod84560644editdlrm
perl5224delta.pod44600644editdlrm
perl5240delta.pod649230644editdlrm
perl5241delta.pod82150644editdlrm
perl5242delta.pod41130644editdlrm
perl5243delta.pod114280644editdlrm
perl5244delta.pod45100644editdlrm
perl5260delta.pod1018350644editdlrm
perl5261delta.pod79270644editdlrm
perl5262delta.pod78800644editdlrm
perl5263delta.pod70670644editdlrm
perl5280delta.pod721130644editdlrm
perl5281delta.pod46390644editdlrm
perl5282delta.pod62000644editdlrm
perl5283delta.pod51110644editdlrm
perl5300delta.pod412810644editdlrm
perl5301delta.pod57300644editdlrm
perl5302delta.pod46820644editdlrm
perl5303delta.pod49800644editdlrm
perl5320delta.pod546010644editdlrm
perl5321delta.pod70030644editdlrm
perlaix.pod204380644editdlrm
perlamiga.pod57490644editdlrm
perlandroid.pod82220644editdlrm
perlapi.pod4931060644editdlrm
perlapio.pod213360644editdlrm
perlartistic.pod70100644editdlrm
perlbook.pod83860644editdlrm
perlboot.pod2940644editdlrm
perlbot.pod3040644editdlrm
perlbs2000.pod79940644editdlrm
perlcall.pod567380644editdlrm
perlcheat.pod44800644editdlrm
perlclib.pod96070644editdlrm
perlcn.pod47630644editdlrm
perlcommunity.pod69830644editdlrm
perlcygwin.pod272020644editdlrm
perldata.pod497820644editdlrm
perldbmfilter.pod49810644editdlrm
perldebguts.pod423310644editdlrm
perldebtut.pod221520644editdlrm
perldebug.pod393830644editdlrm
perldelta.pod70030644editdlrm
perldeprecation.pod208250644editdlrm
perldiag.pod2969860644editdlrm
perldos.pod105220644editdlrm
perldsc.pod256140644editdlrm
perldtrace.pod79590644editdlrm
perlebcdic.pod843450644editdlrm
perlembed.pod375690644editdlrm
perlexperiment.pod72340644editdlrm
perlfork.pod133550644editdlrm
perlform.pod166080644editdlrm
perlfreebsd.pod16230644editdlrm
perlfunc.pod4037770644editdlrm
perlgit.pod295910644editdlrm
perlgov.pod144810644editdlrm
perlgpl.pod138150644editdlrm
perlguts.pod1621030644editdlrm
perlhack.pod431570644editdlrm
perlhacktips.pod576920644editdlrm
perlhacktut.pod61530644editdlrm
perlhaiku.pod15080644editdlrm
perlhist.pod561640644editdlrm
perlhpux.pod306090644editdlrm
perlhurd.pod19940644editdlrm
perlintern.pod835650644editdlrm
perlinterp.pod337150644editdlrm
perlintro.pod221350644editdlrm
perliol.pod348040644editdlrm
perlipc.pod715290644editdlrm
perlirix.pod44150644editdlrm
perljp.pod84310644editdlrm
perlko.pod122080644editdlrm
perllexwarn.pod3550644editdlrm
perllinux.pod20070644editdlrm
perllocale.pod741120644editdlrm
perllol.pod95800644editdlrm
perlmacos.pod9980644editdlrm
perlmacosx.pod121240644editdlrm
perlmod.pod261970644editdlrm
perlmodinstall.pod102610644editdlrm
perlmodlib.pod763480644editdlrm
perlmodstyle.pod225880644editdlrm
perlmroapi.pod32800644editdlrm
perlnetware.pod66480644editdlrm
perlnewmod.pod110370644editdlrm
perlnumber.pod83530644editdlrm
perlobj.pod357170644editdlrm
perlootut.pod267570644editdlrm
perlop.pod1488880644editdlrm
perlopenbsd.pod12240644editdlrm
perlopentut.pod152230644editdlrm
perlos2.pod933480644editdlrm
perlos390.pod165270644editdlrm
perlos400.pod47650644editdlrm
perlpacktut.pod513700644editdlrm
perlperf.pod498810644editdlrm
perlplan9.pod51250644editdlrm
perlpod.pod230760644editdlrm
perlpodspec.pod686280644editdlrm
perlpolicy.pod265620644editdlrm
perlport.pod886930644editdlrm
perlpragma.pod51760644editdlrm
perlqnx.pod66730644editdlrm
perlre.pod1308170644editdlrm
perlreapi.pod302450644editdlrm
perlrebackslash.pod322850644editdlrm
perlrecharclass.pod497070644editdlrm
perlref.pod354320644editdlrm
perlreftut.pod188260644editdlrm
perlreguts.pod393010644editdlrm
perlrepository.pod5090644editdlrm
perlrequick.pod191410644editdlrm
perlreref.pod155900644editdlrm
perlretut.pod1225270644editdlrm
perlriscos.pod15290644editdlrm
perlrun.pod559800644editdlrm
perlsec.pod276010644editdlrm
perlsecpolicy.pod194500644editdlrm
perlsolaris.pod298430644editdlrm
perlsource.pod71320644editdlrm
perlstyle.pod87340644editdlrm
perlsub.pod744050644editdlrm
perlsymbian.pod153440644editdlrm
perlsyn.pod451380644editdlrm
perlsynology.pod79600644editdlrm
perlthrtut.pod465220644editdlrm
perltie.pod393140644editdlrm
perltoc.pod7018000644editdlrm
perltodo.pod3720644editdlrm
perltooc.pod2940644editdlrm
perltoot.pod2940644editdlrm
perltrap.pod106230644editdlrm
perltru64.pod84920644editdlrm
perltw.pod44630644editdlrm
perlunicode.pod913530644editdlrm
perlunicook.pod256580644editdlrm
perlunifaq.pod136440644editdlrm
perluniintro.pod386470644editdlrm
perluniprops.pod4416140644editdlrm
perlunitut.pod79510644editdlrm
perlutil.pod72910644editdlrm
perlvar.pod825770644editdlrm
perlvms.pod508230644editdlrm
perlvos.pod38430644editdlrm
perlwin32.pod403170644editdlrm
Edit: /usr/share/perl5/pod/perlnewmod.pod (11037B)
=head1 NAME perlnewmod - preparing a new module for distribution =head1 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. 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. 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 L, L and L before coming back here. 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. You should also take a look at L for best practices in making a module. =head2 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. =head2 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. 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. 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 L which then talk to higher level modules analogous to L. The choice is yours, but you do want to get a module out for that server protocol. 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. So hopefully you've now got a few ideas about what's good to modularise. Let's now see how it's done. =head2 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. =over 3 =item Look around Dig into a bunch of modules to see how they're written. I'd suggest starting with L, since it's in the standard library and is nice and simple, and then looking at something a little more complex like L. For object oriented code, L or the C modules provide some good examples. These should give you an overall feel for how modules are laid out and written. =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 L and make sure you're not the one reinventing the wheel! =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 C mailing list (send an email to C to subscribe; see L for more information and a link to the archives). =item Choose a name Perl modules included on CPAN have a naming hierarchy you should try to fit in with. See L 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. =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. 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. =back =head2 Step-by-step: Making the module =over 3 =item Start with F or F The F utility is distributed as part of the L 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: module-starter --module=Foo::Bar \ --author="Your Name" --email=yourname@cpan.org If you do not wish to install the L package from CPAN, F is an older tool, originally intended for the development of XS modules, which comes packaged with the Perl distribution. A typical invocation of L for a pure Perl module is: h2xs -AX --skip-exporter --use-new-tests -n Foo::Bar The C<-A> omits the Autoloader code, C<-X> omits XS elements, C<--skip-exporter> omits the Exporter code, C<--use-new-tests> sets up a modern testing environment, and C<-n> specifies the name of the module. =item Use L and L 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? =item Use L The L 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: warn "No hostname given"; the user will see something like this: No hostname given at /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm line 123. which looks like your module is doing something wrong. Instead, you want to put the blame on the user, and say this: No hostname given at bad_code, line 10. You do this by using L and replacing your Cs with Cs. If you need to C, say C instead. However, keep C and C in place for your sanity checks - where it really is your module at fault. =item Use L - wisely! L gives you a standard way of exporting symbols and subroutines from your module into the caller's namespace. For instance, saying C would import the C subroutine. The package variable C<@EXPORT> will determine which symbols will get exported when the caller simply says C - you will hardly ever want to put anything in there. C<@EXPORT_OK>, on the other hand, specifies which symbols you're willing to export. If you do want to export a bunch of symbols, use the C<%EXPORT_TAGS> and define a standard export set - look at L for more details. =item Use L 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. C or C will provide a stub for you to fill in; if you're not sure about the format, look at L 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. =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, C and C provide a test framework which you can extend - you should do something more than just checking your module will compile. L and L are good places to start when writing a test suite. =item Write the F 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 F and F directories if you make it onto the modules list. It's a good idea to put here what the module actually does in detail. =item Write F Add any user-visible changes since the last release to your F file. =back =head2 Step-by-step: Distributing your module =over 3 =item Get a CPAN user ID Every developer publishing modules on CPAN needs a CPAN ID. Visit C>, select "Request PAUSE Account", and wait for your request to be approved by the PAUSE administrators. =item C Once again, C or C has done all the work for you. They produce the standard C you see when you download and install modules, and this produces a Makefile with a C target. Once you've ensured that your module passes its own tests - always a good thing to make sure - you can C to make sure everything looks OK, followed by C, and the Makefile will hopefully produce you a nice tarball of your module, ready for upload. =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. Alternatively you can use the F script, part of the L distribution on CPAN. =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... =back =head1 AUTHOR Simon Cozens, C Updated by Kirrily "Skud" Robert, C =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L L, L, L L, Ken Williams' tutorial on building your own module at L