Reviews by Olivier Mengué (dolmen)


Dist-Zilla (6.009) ****

dzil is a very valuable tool if you have to maintain a significant number of CPAN or darkPAN distributions. Plugins allow to easily improve the quality of your packaging or to increase testing. Plugin bundles allow to standardize your packaging process across multiple projects, and this is very helpful as a CPAN author or in a company.

The IRC support (#dzil on is highly responsive and will help you to find a solution to any problem you may encounter.

Unfortunately support for perl < 5.14 has been suddently dropped with dzil 6.0, so I'm stuck with dzil 5.047 (from BackPAN) for a perl 5.10.1 only project until someone implements cross-perl testing.

Class-Load (0.23) *

Class::Load is easy to use... until you discover its caveats.
For example try_load_class doesn't work properly with 'Sub::Util' See

Use instead Module::Runtime (that Class::Load now uses under the hood).

Net-Packet (3.28) *

This module declares itself as "obsolete, you will receive no support", but this is not mentionned in the POD or on the bug tracker. So you may discover this like me only once you have endured the broken install of Net::Libdnet.

See Net::Frame instead.

Net-Libdnet (0.98)

Painful to install on Ubuntu because the Makefile.PL is not smart enough to automatically apply the bundled patches to handle the dnet.h/dumbnet.h differences.

Net-Google-Spreadsheets (0.1501) ***

0.1501 uses by default Net::Google::AuthSub that uses a Google API that has been deprecated for 2 years and that now longer works at all.

The workaround is to use Net::Google::DataAPI::Auth::OAuth2 for authentication.

Mozilla-CA (20130114) *

Certificate authority certificates are a critical part of the TLS infrastructure and that must be kept up to date.

This package has not been updated for years now.

So, don't use it.

LWP-Protocol-sftp (0.05) *****

It just works.

Using this LWP plugin is a good way to extend App::cpanminus to use a CPAN-like mirror over SSH.

Python-Decorator (0.03) **

Comments on the announcement of this module:

A more perlesque port of Python decorators would use function attributes.

MailTools (2.12) *

Mail::Header->unfold and Mail::Header->fold just don't work (see RT#91309) while this module is almost 20 years old. So you can expect many bugs everywhere else.

mem (0.3.3) *

This module is useless.

The problem the author was trying to solve can be solved easily:
- "use mem" with arguments part: use BEGIN { } blocks
- "use mem;": set the %INC entry explicitely (or use me::inlined)

The-synthesizer (0.0201) *

Besides being useless, it is not much portable: only Windows, Mac OS X and Linux are supported.

Term-Detect (0.08) *

Term::Detect tries to detect settings of the terminal by looking for known process names in the process tree (and the non portable pstree command is used for that). This is flawed and against the Unix way of handling terminals:
- this will not work when the process runs on a remote server (through SSH)
- this will not work properly when the process is launched from a terminal multiplexer (screen, tmux)

The proper way is instead to base detection on $ENV{TERM} and the terminfo database. So, see instead Term::Terminfo and Term::Encoding.

Module-Build-Prereq (0.01) *

Very naïve implementation with a confusing name.
See instead Perl::PrereqScanner.

Git-Demo (0.02) *

Inexistent documentation.


This distribution uses a non-standard build tool on Win32.

Tree-Persist (1.02) *

Persistence formats are not pluggable. Tree::Persist::File::XML and Tree::Persist::DB::SelfReferential are hard-coded.

IP-China (0.02) *

This module is very specific to China while the approach could be more generic.

And the build script (to rebuild the module from an updated GeoIP) is not bundled, so if you use this module you rely entirely on its maintainer to provide updates. And controlling the content (the IP blocks) is hard.

JSON-RPC2 (0.1.1) *****

At least someone who understood the power of JSON::RPC 2!
This implementation fixes the major flaw of almost all JSON::RPC implementations: it separates the transport layer.
And so it works well inside event loops such as AnyEvent.

App-gh (0.63) *

Despite the 'Changes' file that says for 0.60 that Net::Github::V3 is supported, that does not seem to be the case: after fixing a first obvious bug in the "list" command, "gh list dolmen" just says "v2 API is deprecated from github".

So it doesn't work.

It also lacks POD for the "gh" command.

App-GitHub (1.0.1) *

Seems powerful, but the documentation is almost inexistent. I've not been able to figure out how to even list my repos.

It also doesn't use an OAuth token for authentication.

Devel-Modlist (0.801) ****

Good one.
See also Devel::TraceUse that reports information as a loading tree and can work with "perl -c".

AnyEvent-MPRPC (0.15) ***

This distribution includes the AnyEvent::MessagePack module that would desserve to have its own distribution.
This review is only about AnyEvent::MessagePack.

AnyEvent::MessagePack combined to its underlying engine Data::MessagePack::Stream has currently major design issues that makes it not a 100% clean AnyEvent read_type: it will eat all the data it receives and pass it to Data::MessagePack::Stream, even if not all data is MessagePack. So if your stream combines both MessagePack and other data types (JSON, Storable) at the raw level, don't expect it to work correctly. As Data::MessagePack::Stream 0.07 doesn't have an API to give back the data it didn't consume, this is not fixable.

Also bug #74518 makes it quite unreliable.

Devel-Dependencies (1.00)

Similar in function to Devel::TraceUse.

See a review of related modules by Neil Bowers at

Nothing-Tiny (1) *

Claims to be Tiny, but fails due to "use strict; use warnings;" that also make it not portable on anything older than perl 5.6.

Also, as a distribution using Module::Install, it is definitely not "tiny" and waste space on CPAN mirrors.

Template-Mustache (v0.5.1) **

Documentation is awful. No SYNOPTIC, no examples at all.
So can't tell about interface and the code quality.

Dist-Zilla-Plugin-EOLTests (0.02) **

This module has been forked into Dist::Zilla::Plugin::Tests::EOL that has some fixes.

Dist-Zilla-Plugin-GitHub (0.19) **

This is only a review of DZP::GitHub::Meta

GitHub::Meta accesses the GitHub API to query the meta values. So it needs a network access and your GitHub credentials. Also the repo must be set manually in dist.ini.

In contrast Dist::Zilla::Plugin::GithubMeta works only locally by looking at your git remotes. It also has more settings.

So if you just want to set metadata then use instead Dist::Zilla::Plugin::GithubMeta.

Win32-Codepage (1.00) *

This module is misleading in its name and documentation: it mixes "code pages" (which are called "encodings" in the Perl world) with "language identifiers" and "locale identifiers".

More information about what code pages (as defined in the Win32 world) are:

Language identifiers:
Locale identifiers:

Also for the implementation, the module uses the registry which is not a official way of retrieving the information.

And last, it has no method to retrieve the OEM code page.

So see instead Win32::CodePage::Simple.

Array-Utils (0.5) ***

Despite the generic name, this is not a generic implementation of array manipulation because all values are stringified when processed.
So this module should only be used for arrays of strings.
See RT#75835 for details.
See List::MoreUtils as an alternative.

ASPerl (0.01) *

No documentation.
Uses a top level namespace, but for what reason?

Bundle-Everything (0.06) *

Version 0.06 added documentation about what "Everything" means.
Anyway, it is still useless.

Perl-Tags (0.28) *

I wanted a module to generate a tags file for my project.

But the POD documentation of this module is awful, and so I've not been able to successfully use it. It seems also outdated as the distribution contains an undocumented Perl::Tags::PPI.
The README contains some additional web links not in the POD, but that's is not where I expect to find how to use the module.

Even a quick look at the code did not helped me. I gave up.

Sys-Sysconf (0.03) *

sysconf() is in the POSIX module which is in the Perl core.
This only use for this distribution is to extract sysconf constants from /usr/include/sys/unistd.h that may not be exported in the POSIX module.
If your Perl has been packaged by your operating system vendor you probably don't need it.

pmtools (1.10) ***

Good tools, but the distribution needs an important update to be installable by CPAN tools as it does not follows the usual conventions and lacks META.yml.
It is packaged for Debian though.

setenv (0.03) *****

Great module to change environment when running a Perl script on Win32:


FOO=123 perl -e "print qq'$ENV{FOO}\n'"

FOO=123 ./

perl -Msetenv=FOO,123 -e "print qq'$ENV{FOO}\n'"

perl -Msetenv=FOO,123

POE-Component-Schedule (0.94)

Test coverage: 92.1%

POE-Component-Cron (0.021) ***

Since release 0.021 this module is based on POE::Component::Schedule for the scheduling as this where I have extracted the core. So if you don't need the cron string parsing, that's the module to use.

Regexp-Common-Email-Address (1.01) *

The only problem of this module is that it probably doesn't do what you expect if you just want to validate user input: it accepts much more than just "mailbox@domain", including spaces... See opened bugs.

Data-Recursive-Encode (0.03) *****

Exactly the module I needed, with a name that matched my search request on CPAN.

This is the module to use when you have to clean dirty data.

In my case I could not use PerlIO to directly load UTF-8 text from a file because I had to process the data through a regexp and my Perl has a bug in the Regexp engine. As a workaround I load text as binary, parse it with Regexp::Grammars, and feed the result tree to Data::Recursive::Encode.
(For details of the Perl bug, see )

POE-Wheel-Run-Win32 (0.18) ****

POE::Wheel::Run::Win32 has now been merged into POE::Wheel::Run since 0.18 (POE 1.280) so this module is now useless (only provided for compatibility).

Win32-Scheduler (v20000702) *

Documentation is missing and, worse, is the documentation for another module.

POE (1.268) *****

POE is THE module you must use for event programming.
The code is of great quality with an extended test suite, and it works on all platforms I have access to (Linux, Win32, HP-UX).
The support is of first class quality: bugs are quickly fixed and new release occur often.
Many plugins are available to handle any kind of events you may imagine.

makepatch (2.03) *

Very useful on unix-like systems.
Too bad it has many problems with end-of-line handling so it does not work on Win32 because the checksum feature is too strict.