Reviews by Pista Palo



File-ChangeNotify (0.20) *

Moose-infected garbage for monitoring changes to files. There are lots of better solutions on CPAN, including EV, Linux::Inotify2, and AnyEvent::Inotify::Simple.

Algorithm-BMI (0.01) **

This is mostly pointless, since all you need to know is:

BMI = kg/m^2

or, in standard units:

BMI = lb*703/in^2

In any case, there are better ways to measure lean body mass, and if you're a programmer, you could probably stand to drop a few pounds.

Data-Paginate (0.0.6) *

Worse than the usual DMUEY (Daniel Muey) crap -- it doesn't contain anything! Avoid anything by this author.

cPanel (v0.0.1) *

Typical DMUEY (Daniel Muey) crap. Avoid anything by this author.

last (v0.0.1) *

Typical DMUEY (Daniel Muey) crap. Avoid anything by this author.

Unix-PID-Tiny (0.9) **

It conforms to the "Tiny" spec AFAICT, but it's the same useless garbage as Unix::PID. Avoid.

Unix-PID (0.23) *

A hideous interface to a bunch of unrelated functionality with bizarre prereqs. Utter garbage.

Have you ever wanted a single module that would let you (1) split "ps" output by column; (2) create lockfiles containing PIDs; and (3) call "kill" and "waitpid" through an awkward interface? If so, this is the one for you!

What do you think

$x = new Unix::PID;

does? If you thought it might create an object representing stuff about the current process, you would be wrong. If you want that, you use


Yep. $x contains valuable state such as the location of "ps" on your system.

Lingua-LO-Romanize (0.08) *

Oh, look... it's a big look-up table. One that will take forever to install thanks to its insane prereqs:

Another typical Moose-turd.

Modern-Perl (1.03) *

This groundbreaking module has been made obsolete: see Acme::Very::Modern::Perl and Acme::Postmodern::Perl.

DateTime-Tiny (1.04) *****

A welcome alternative to DateTime's hyper-complexity. It won't do date arithmetic in Mongolian Daylight Savings Time, but for most people's basic needs, it's just fine.

bareword-filehandles (0.003) *

Yay, another sad (pra|do)gma module in the style of "indirect." Here's an easier solution: if you don't want to use bareword filehandles, then don't use them.

ConditionSystem (0.01) *

The author's heart is in the right place -- Lisp's "conditions" are a good way to deal with errors -- but... This turd salad forces you to install the Moose-plus-dependencies nightmare FOR ITS TESTS. Please try again.

true (0.14) *

Why type "1;\n" at the end of your script when you can type "use true;\n" at the beginning? Because the latter makes you look "Modern" with a capital "M," that's why! Will someone rid us of these meddlesome chromatards?

Text-BibTeX (0.43) **

Broken after switching to a new maintainer: "I am sorry for all other languages that might be using this library [btparse]. For them my suggestion is that they make Text::BibTeX as a dependency." Use version 0.34 to get the working version.

Module-Starter (1.54) *

If "h2xs -AXn" doesn't work for you, a basic script to create a new module (Makefile.PL, MANIFEST,,, README, ChangeLog) is 100-200 lines of simple print statements. Module::Starter takes this simple process and makes it complicated and annoying. It adds useless boilerplate to several files, then adds a failing test that looks for the boilerplate it just added. It creates a random file "ignore.txt" that does... something. It looks like "ignore.txt" used to be the author's .cvsignore or .gitignore. It creates a Changes file in its own idiosyncratic format, with unhelpful content you will need to delete and replace.

It will take you less time to write your own "module starter" than to install and run "module-starter", then clean up the mess it creates.

Test-ExistsExecutable (0.024) *

I'm not really seeing the point. What's wrong with using

$file =~ m!/! ? -x $file : grep { -x "$_/$f" } split /:/, $ENV{PATH};

Bio-Phylo (0.18)

Not actually a module; just a META.yml.

EDIT: The author seems to have fixed the module.

common-sense (3.0) *****

Something in short supply these days...

EDIT: @ADAMK -- It seems straightforward to make an alias/copy named Enterprise::Perl::SolutionsManagementFactory or some-such. Is there demand for such a thing?

Data-Rmap (0.62) *****

Nice! A simple, well-thought-out interface to arbitrary data structure traversal. Some sort of hook for classes (e.g. an "_rmap" sub) would be a nice addition.

Acme-Very-Modern-Perl (0.02) *****

Why go for half measures in your attempt to be "Modern?" Whoever you're trying to placate, this module will do it. Awesome!

Mouse (0.43) *****

A nice, light-weight alternative to the Moose fad.

Symbol-Util (0.0202) *

A complete waste of space. Why use this module to write

print join "\n", keys %{ stash("main") };

when you can just write

print join "\n", keys %main::;

Piotr: Maybe you could edit your review to point at the important parts?

WWW-Search (2.507) *

Please either stop listing Test::Pod::Coverage as a prerequisite, or move this module to Acme::.

Test-Pod-Coverage (1.08) *

This module is a minor CPAN plague:

Please don't make it a prerequisite.

Algorithm-TravelingSalesman-BitonicTour (0.05) *

Please either stop listing Test::Pod::Coverage as a prerequisite, or move this module to Acme::.

Algorithm-CurveFit (1.04) *

Please either stop listing Test::Pod::Coverage as a prerequisite, or move this module to Acme::

AI-ParticleSwarmOptimization (1.003) *

Please either stop listing Test::Pod::Coverage as a prerequisite, or move this module to Acme::.

Abstract-Meta-Class (0.13) *

Please either stop listing Test::Pod::Coverage as a prerequisite, or move this module to Acme::.

File-Map (0.19) ****

The import interface is wonky (why make people write a bunch of ":foo"?), but this module is heading in the right direction.

Scope-Upper (0.09) ****

The interface is a bit wonky ("$ctx = SUB UP SUB"?!), and the black magic may be fragile to internals changes. But force-unwinding the stack without eval or magic goto is seriously cool and useful, letting you do non-local control transfers in other people's code without changing it.

Test-Functional (0.03) *

Just what we need: another test module with its own special syntax. Until there's a "SEE ALSO" section explaining why you would want to use this instead of the other 1500 (I kid you not) Test module on CPAN, this is unadulterated FAIL.

EDIT: Adam J. Foxson and sundry down-voters: It's the least you can do to explain how your re-implemented wheel differs from our current 1500 wheels.

Proc-Class (0.03) **

There are levels of silliness to which one should not stoop. Even in the synopsis, the order of slurp_stdout() and slurp_stderr() could be wrong.

Sys-Mmap-Simple (0.13)

WTH? The same author has also submitted File::Map, which does basically the same thing. Which one is supported?

libwww-perl (5.827) *****

LWP::Simple shows how interfaces should be done:

use LWP::Simple;

$content = get("";);

die "Couldn't get it!" unless defined $content;

If I want to get a URL's contents, I get() the "URL's" $content. IO::All takes it a step further, but LWP::Simple shows how to make easy things easy.

Devel-Size (0.72) *****

It does what it claims, and is well-documented, but the size() function is of limited use; most of the time you want total_size(). Also, it occasionally crashes calculating the size of magic variables.

PadWalker (1.7) *****

Works as advertised, and provides all the necessary operations: peek_my to get variables declared in a scope, and peek_sub to get variables used (declared and closed over). For its limited audience, this is a good module.

OP (0.212) *

FAIL: "Using the OP module initializes all built-in object types, and causes strict, diagnostics, OP::Class, OP::Type, Perl6::Subs, and Error to be imported by the caller."

In other words, it "helpfully" pulls in a bunch of garbage when you import it, including a source filter. But hey, once you're done installing its 42 dependencies, your next trip to the CPAN will be much faster, since it's probably already installed.

MooseX-MethodAttributes (0.18) *

For today's edition of "CPAN one-liners," we have ten -- count 'em, ten! -- classes and a random dependency on namespace::clean to replace this:

use attributes; attributes::get(\&f)

with this:

use MooseX::MethodAttributes; @{main->meta->get_method('f')->attributes}

hdp: There is being dishonestly clueless, and then there is that thing you're doing. Please stop.

Sam, Sam, Sam... There are those who believe that simple procedural interfaces are sufficient for many language features, and those that believe that all must be accessed by pedantically "object-oriented" interfaces.

If you're not sold on the first idea, you might reach the conclusion of Sam. In which case, please continue to reinvent wheels badly, and hope that people don't ever cally your code "pointless style fapping" as soon as you write it.

Statistics-Descriptive (2.7)

Note that since changing maintainers, this module has gone the way of "best practices" code shuffling while not improving functionality. 2.6 was the last feature-related release.

Proc-Exists (0.94) *

Yay! Another way to spell "kill(0, @pids)"!

Chart-Gnuplot (0.08) ***

Looks okay, but if you already know the gnuplot language, then it's probably easier to generate a script and run it. If you don't, then you will probably have a hard time using this module. Plus, it's easy to learn.

Perl-Critic-Bangs (1.02)

Please God let there be a Perl::Critic::Bangs::Yermom.

File-Stat-Moose (0.06) *

Another fail-burger from the master chef! Who could have known that CPAN needed more than one hard-to-use reimplementation of File::stat? Who could have imagined that this need could only be filled with 14 prerequisites?

IO-Moose (0.09) *

Dear God, what a bucket of fail! If reading the contents of a file requires more text than "slurp $filename," or requires other modules, you have lost.

Moose-Tiny (0.0.3) *

A not-quite-funny joke that belongs in Acme::.

File-Stat-OO (0.03) *

I'm not sure why this exists when we already have File::stat, with an equivalent but simpler interface. The docs even link to File::stat in the "See Also" section, but give no comparison.

ToolSet (0.99) **

Another module from the "I can has arrows" crowd. Why do interfaces have to suck like this? There is no reason for the string "ToolSet->" to appear anywhere in the synopsis example.

EDIT replying to other reviewers: My guess is that no one will extend this module by subclassing (or even use it at all, FWIW). Feel free to point to examples to the contrary.

Object-Disoriented (0.02) *****

Brilliant! See also Acme::Nooo, for another version.

Sub-Curried (0.04)

See also Attribute::Curried...

Module-CPANTS-Analyse (0.81) *


my $analyser=Module::CPANTS::Analyse->new({






Why not just:

$res = Module::CPANTS::Analyze('path/to/foo')

Module-Changes (0.05) *

Big bucket o' fail. A marginally useful feature ("machine-readable ChangeLog") requiring a bucketload of vaguely-related dependencies. This is a waste of bits.

Test-TAP (0.02) *

Is this testing meta-humor, or meta-testing humor? Either way, do not want...