Important: make sure the filename you choose contains a version
number. For security reasons you will never be able to upload a
file with identical name again. This strict requirement does have one
exception: documentation files may be overwritten. There's a simple
regular expression that draws the line between docu and code:
/(readme|\.html|\.txt|\.[xy]ml|\.json|\.[pr]df|\.pod)(\.gz|\.bz2)?$/i. Filenames matching this
regexp can be uploaded as often as you like. By the way: it is highly
appreciated if your packages come tarred and gzipped with a
Makefile.PL (or Build.PL), so they can be installed in a standard way.

Registering as a developer

Registered developers have a unique username and a home directory in
the authors/id/ tree of CPAN. The write access to that
directory is password protected.

If you have written a module, script, or documentation
you would like to contribute to the
archive, visit pause.perl.org
Registration (Non-SSL version) and fill in the form.
You will be notified by email about your registration. Please allow
three weeks for proceeding, which should be the maximum during
vacation time. Normally we hope to register you within a week. The
resulting email traffic will run through modules@perl.org and will be
archived at http://www.nntp.perl.org/group/perl.modules/.
modules@perl.org isn't a mailing list, just an alias for the
maintainers of the Perl 5 modules database. Please do not try to
subscribe. Visit the archive instead.

We trust that you have read the perlmodinstall,
perlmodlib, perlmodstyle, and
perlnewmod manpages and that you regularly check out
uploads to CPAN and that you have been watching CPAN activities for a
while to have an impression of how things fit together. It usually
boils down to (slogan shamelessly stolen and adapted from sudo(1)):

Choosing a good name is important if you want people to find your module
on CPAN and understand (from the name alone) what it does.

Likewise, there are so many modules already on CPAN that it's a good idea
to be sure that your module is doing something new or at least different
(and hopefully better) than something already on CPAN. Search for similar
modules on metacpan.org or
search.cpan.org.

If you have never uploaded a module to CPAN before (and even if you have),
you are strongly encouraged to get feedback on
PrePAN.

PrePAN is a site dedicated to discussing ideas for CPAN modules with other
Perl developers and is a great resource for new (and experienced) Perl
developers. You can also consider discussing your ideas in other local
community groups or
online community sites like Perl Monks.

Also: think carefully and honestly whether your module
would be better off if it were integrated into an already
existing module. Sometimes it is for the best to put aside personal
glory and join a collaborative effort: Perl itself is a good example
of this. Contact the author of an existing module and ask whether your
new features would fit into his framework. Even if you in the end
decide to release the module as your very own, you really should know
your 'competition', that is, know all the similar modules and the
features they offer. Maybe you can learn from them, maybe you can help
the users of your module better by giving them an overview about
similar modules.

Authors upload new modules to PAUSE, which is responsible for inspecting,
validating and indexing uploads. PAUSE unwraps the upload and scans the source code
(namely all *.pm files) for package declarations. In order for
a module to be indexed, the submitting author must be the owner or an authorized
maintainer for every package namespace found (unless the namespace is new, in
which case the uploading author becomes the owner of it).

After a module is uploaded to PAUSE, it propagates to
www.cpan.org and dozens of other CPAN mirrors
around the world. PAUSE also creates a number of index files used by CPAN clients
like CPAN(.pm), CPANPLUS and cpanminus:

So there's a module on CPAN that has a critical bug, lacks some features,
or is generally under-maintained and you would like to step in?

It's great that you want to help out and we, the PAUSE admins, really
don't want to create any unnecessary barrier to getting involved with
an existing module (or distribution) on CPAN. There are, however,
some precautions we have to take. The following paragraphs outline the
reason for these precautions and the steps you have to take. Please
read them carefully.

The majority of modules on CPAN has active maintainers. If the
maintainer didn't answer the ticket you created in the request tracker,
maybe she doesn't know about the CPAN ticketing system yet? Or she's
just very busy this week and will get back to you in due time. The best
way of helping out is to talk to the current maintainer about what you
can do. Getting the PAUSE admins involved is only a last resort!

In some circumstances, we can grant co-maintenance permissions to you
or others if the current maintainer of a module has entirely
disappeared. You have to understand that is not a decision we make
lightly. We are essentially giving write access to somebody else's work
to third parties without explicit consent from the missing author.
Since almost all code on CPAN has a free license, this is likely
unproblematic from a legal point of view, but any violation of a
contributor's trust in the PAUSE/CPAN mechanisms is a serious blow
against the work of everybody who contributes to CPAN. For this
reason, we try to tread very lightly, make the least possible use of
the administrative privileges and attempt to protect voluntary
contributors like yourself or the author of the module at hand
from any unnecessary burden.

You have to realize that the author has probably invested a
signficiant amount of time into writing the code in the first place
and then gone through the additional work of making it available to
others via CPAN free of charge. Therefore, it is crucial to be very
polite when asking him or her for co-maintenance permissions.
Politeness, however, does not suffice. Particularly when maintaining
a module for which you received co-maintenance permissions from the
admins (as opposed to being appointed by the author himself), you are
*required* to respect the work and design of the author. A common
fallacy is that people think they are much better programmers than
their predecessors and that entitles them to judge others code quality
and refactor everything. Whether or not your style is "better" is
entirely irrelevant as it is not your code. Do not be arrogant, be
respectful and tread lightly!

If you published your code to CPAN, then went on a hiking vacation (or
to hospital) for a couple of weeks only to see that somebody took over,
completely changed the design, and generally wreaked havoc, you would
probably be rightfully upset and lose the good will that made you
contribute in the first place.
In order to prevent from happening, please go through the following
steps and remember to be respectful all along:

Use the rt.cpan.org request tracker to submit a bug report. If the
module's documentation lists another request tracker, try that
instead.

Try to reach the author via mail. At the very least, try
PAUSE_ID@cpan.org, any mail address the author listed on his
search.cpan.org/~PAUSE_ID page, and any mail address that's listed
in his or her module documentation. If there's even a mailing list,
don't forget that either.

Search the web for other ways of contacting the author.
Send more mail.

Try posting in public places such as your use.perl.org journal,
perlmonks.org or other forums about your looking for the author.

Wait for *at least* several weeks. Remember, the author might be on
vacation, ill, or simply busy.

Always keep modules@perl.org in the picture. Send us a copy of your
mails to the author. After a reasonable period of waiting, send
another mail to the list explaining how you tried to contact the
author and pointing at the proof thereof. Do not forget to include
your PAUSE ID and that of the original module author in this mail.

Usually, after all this hassle, we are reasonably quick at assigning
co-maintenance permissions, but don't hold your breath, we're only
human after all. Most requests won't even get here as many authors
who moved on and don't maintain their modules any more are very happy
to see them taken care of and will assign (primary or) co-maintenance
permissions after you've tracked them down and asked nicely.

Do not upload the READMEs that are integrated in your distribution
files. PAUSE is designed to take care of unwrapping your file with tar
or zip, registering all the modules it finds in there, and placing the
readme file (i.e. a file with the name README in
the top level directory of your package) into your directory. PAUSE
will change the name of the file to
package-name.readme. It should do so within
a few hours after your upload.

Please make sure all your *.pm files contain a
$VERSION variable that conforms to the CPAN rules, i.e.
the complete computation of $VERSION must take place on the one first
line within the module that assigns to it. You can test if this is the
case by running

on the filenames in question. The CPAN indexer will run this code
within a Safe compartment, so maybe even if the above command
succeeds, PAUSE may fail if you're doing file IO or other potentially
dangerous things within that line.

Before you decide which style of versioning you prefer, you might
want to read the version manpage.

The automatic integration of your work into several indexes
and directory trees is not always what you desire. Often you want to
release code for testing out the next release. Code that propagates
through CPAN but is not in a stable state. Something between
two versions.

If you want to do that simply choose a filename that matches
/\d\.\d+_\d/ or contains TRIAL.
Please choose a sequence that is easy to comprehend. People have adopted
different conventions:

Other people do odd and even, with all odd majors always being dev
releases:

0.15_01
0.15_02
0.16
0.1601
0.1602
0.17_01
0.17_02
...

PAUSE will leave the underscore distributions alone: no readme will
be extracted, no index will be updated, no symlinks will be created.
Of course many users on the CPAN will take note of the developer
releases. Cpan testers will
test them and bug chasers will probably file bug reports in RT.

Any distribution that arrives at PAUSE is checked for package names
contained in the distribution. A package name that arrives for the
first time is automatically assigned either to the author who
submitted it or to user perl if the distribution file is a perl
distribution. A package name that has already been used before must be
submitted by its author, otherwise PAUSE will trigger a warning to the
administrator. That way PAUSE will prevent accidental usage of a
package namespace by more than one author.

Be prepared that very soon after your upload your module will be
tested on dozens of architectures by the never tired cpantesters.
This helpful lot will send their findings to their mailing list and
collect the results in a database. If they find problems, they try to
diagnose or even solve them and inform you about their findings. So be
prepared to get mail from them before you have closed the buffer in
your editor.

Module::Build is an effort to overcome many deficiencies in
MakeMaker and CPAN. One idea in that context is the storage of
module-metadata in a file META.yml,
that is being integrated into the module-tarball. PAUSE is supposed
to follow this emerging standard. The current code base of the PAUSE
indexer supports META.yml by extracting it and storing it in a
separate file that is called
package-name.meta in the same directory.
The PAUSE indexer honours the contents of the no_index and
the provides fields. All other fields are currently ignored.

Related services on PAUSE

Two documents are available about authors. 00whois.html is a list of
authors, mailing lists and mailing list archives in HTML format,

And 01mailrc.txt.gz is a
smaller list intended to be used as a .mailrc file. Both files are
maintained automatically.

When new files arrive on the PAUSE, an Upload Scanner program scans
the new files and categorizes them according to their contents. It
tries to detect namespace clashes and to keep track of version
numbers.

The document 01modules.index.html
lists only the most recent distribution files that contain the
latest of any given module that is available on CPAN. A second
version of this document is also available that is sorted by modification date. Both
are maintained by the scanner automatically.

The listing 02packages.details.txt is also
produced automatically. It is intended for programs but sometimes is
a valuable information for humans too. It simply lists the current
version number and the distribution file for all packages found on
CPAN.

There are also two symlink trees of modules maintained
automatically. One is based on the basenames of the packages
involved: by-module and the other one
divides the modules by the chapters of the Module List: by-category.