Here's a slightly enhanced version. Maybe we (and here I think I mean
*someone else than me* :-) could annotate this a little bit with more
real-life examples of bad suggestions from the past (maybe changed to
protect the still living people...)
[ --- cut here --- ]
First and foremost: you are naming your module so that people
can find your module. It's as easy - and as difficult - as that.
Suggest two-level namespaces only. You can use deeper namespaces
than that internally in your module, of course, but for namespace
registration, only speak in two level namespaces.
An exception to this are frameworks and/or well-documented
practices, where the framework is the two-level top-level
namespace, and (for example) user contributed namespaces
are "attached" below that, leading into three- or four-
level namepaces. The naming rules and other administration
of such namespaces are mostly outside this document and the
modules list, though the many of the below rules are probably
still applicable.
If you are thinking of introducing a new top-level namespace,
think carefully. Does your module really not fit under any
existing category? Suggesting new top-level namespaces is
likely to be met with great suspicion.
Even though the module naming is in practice a first-come
first-served process, it is quite impolite to grab top-level
names. Yes, even if your project/product is named with
just a single word, please think of people trying to find
something that would help them in their problems. Unless
they know of your project/product, they might not ever find
your module.
Use as specific descriptive nouns, and even preferably, verbs, as
possible as the components of your names. Describe the function,
not the implementation. Avoid vague or generic words.
Remember that though you may be the first to contribute to a namespace,
you may well not be the last or the only one. Someone might later want
to use the namespace, for something unrelated to your modules.
Stay away from qualitative (advertising) adjectives like "Fast" or
"Small", or even worse, "Super", "Hyper" and its kind. All these are
relative virtues, and as modules develop and new modules are
introduced, also volatile and transient virtues. You are hoping that
other programmers would use your module, and they are as suspicious
and weary of hypewords as you are.
Do not embed the implementation or interface of the module to your
module name (Foo::XS, Foo::OO). The user shouldn't care. Instead,
make your module clever enough to choose dynamically between
implementations and interfaces.
We have unfortunately quite many "Object" or "OO", "XS"
or "PL", and "Tk" or "Gtk" examples.
Co-operate. If your module would work as a patch to an existing
module, contact the author of that module and suggest this
possibility. Be polite. Document your changes carefully
and supply good tests. Also, this way you can get someone else
maintaining your code.
If you are thinking of a funny cutesy ha-ha name, please reconsider.
Trust us, the joke will feel much less funny in a month. Note that
there is nothing wrong with recreational programming, and if you want
to show off some sort of clever trick, please use the "Acme::"
top-level hierarchy.
Do try to stay away from acronyms unless they are really widely
known (standards or de facto standards, like HTML). Unless people
are familiar with your acronym, they will never look at your module.
If you are thinking of a module name containing a trademark,
please don't, unless you are working for the owner of the trademark.
You don't like getting phone calls from lawyers, neither do we.
Trademark owners do have priority over deciding what
gets published under categories named after the trademarks.
If you were a company owning the trademark FooWare, wouldn't
you have an interest in someone unrelated you releasing
FooWare::Ping? The FooWare::Ping might be either unrelated
to your FooWare, or related but a really badly written module,
or simply you do no want anyone thinking your company is
responsible for the module, or someone might be trying
to make a joke out of trademark.
Yes, this had happened.
You don't work for the owner of the trademark but you got
a verbal/email okay from some in the company? Sorry, that's not
enough. Get it in writing from their lawyers, get the writing
checked by a lawyer familiar with trademarking issues.
You work for a company and you are thinking of releasing a module
somehow related to your company's product? That's excellent, but
please check with your manager, and preferably with your lawyers.
Are you really supposed to release that software publicly?
We have had this happening: someone working for a company
released a module he wasn't suppposed to, and then left
the company. The company did learn of this and got
a little bit huffy-- but luckily in this case the person
was found, and they settled amicably.
Top-level names to stay away from: Devel, Sys, Text, unicore,
names all in lowercase.
Devel is mainly meant for modules to do with
low-level debugging of/inside Perl itself.
It does not stand for "development" or "developer"
in general.
Sys is a complete disaster. Adding Sys:: in front
of something is completely redundant. We are sorry
it ever got used. Yes, we know there's Sys::Syslog
in the core, and we are we ashamed because of it.
Text is most often very low in information, too.
If your module is working with a natural language
or languages, use "Lingua::". "Text::" is fine
if your module is dealing with formatting of text,
for example. If you are thinking of using "Text"
because your data is "text", please don't.
Unicore/unicore is reserved for the use of the Perl
core for Unicode things.
All names consisting only of lowercase letters are reserved
for the use of the core Perl language.
--
$jhi++; # http://www.iki.fi/jhi/
# There is this special biologist word we use for 'stable'.
# It is 'dead'. -- Jack Cohen