Reviews by David Cantrell



Perl-Dist-Strawberry (1.09) *****

Strawberry Perl is made of 80% win, 10% lovely fluffy kittens, and 10% tasty wholesome organ meat. It is truly a glorious thing. Yes, I know, I marked it down on documentation and interface - but then, it's *perl*. We all know that the documentation isn't perfect and the interface can be a bit weird. I also marked it down a little bit on ease of use, not just because it's perl, but because it's on Win32 which is always hard to use even with strawberries. But it still gets top marks overall, because it mitigates the Suck of Windows so much. It may still be a pain in the arse to use, but it least with Strawberry Perl, perl on Windows is usable.

POE (1.003)

The concerns I voiced about the documentation in my earlier review should be ignored - it was several years ago and the documentation has been completely rewritten.

Task-BeLike-RJBS (1.001) *

This is quite probably the most pointless distribution on the CPAN.

Acme-Tiny (0.1) *****

An excellent example of Tinyness

Test-Mock-LWP (0.04) *

The documentation neglects to explain how to use the module.

Chest (0.082) *

Unnecesary, and the code is utter shit.

Devel-Trace (0.10) *****

This module does one thing and does it well. It's effectively a tiny wrapper around the little-known DB interface to the debugger which makes using it a trivial one-liner.

It's great. It invariably takes mere seconds for Devel::Trace to show me just where it is that I'm being stupid

DBM-Deep (0.96) *****

This very useful module makes an excellent replacement for DBM files and for MLDBM. The author responds quickly to suggestions for enhancements and to bug reports - the bug was in the packaging, not in the module.

The source code is also instructive and well worth reading.

SOAP-Lite (0.60a) **

SOAP::Lite may or may not be a great module. I just can't tell, because it is so poorly documented.

CGI-Application (3.1) ***

This module claims to do a job, which it goes on to do competently. It has copious documentation and good examples. While the docs are a little wordy, we can forgive that. So why the low score?

Quite simply, I don't see the point.

CGI::Application makes it no easier to write large multi-form web-based applications as far as I can tell. It's really just a fancy way of writing:

setup app ...
parse cgi params ...
and then a gigantic if ... elsif ... elsif ... else
block calling various subroutines depending on the state
of the app, as encoded in a cgi parameter
clean up after ourselves

If using CGI::Application, you have to do just as much work as when doing things the simple way, while adding yet another dependency and making things just a little bit harder for whoever it is that has to maintain your code in the future by making them read the docs for yet another module.

Data-Compare (0.02) ***

This is a very useful module indeed and I have no qualms whatsoever about using and recommending it despite the low rating I've given. That's the beauty of CPAN - software can have implementation "issues" but provided it's packaged and documented properly it's nice n' easy to use. But on to those niggling faults.

First, the interface. As is common practice, both a procedural interface and an OO-ish interface are provided. I don't really see *why* people like providing these OO-a-like interfaces (despite me having done this in the past too), because the objects they create don't really represent anything at all. In this case, there is just one method (if we ignore the constructor) which does *exactly* the same job as in the procedural interface. So why bother? It's not as if it's encapsulating any data, inheriting any voodoo, or hiding anything complex.

The procedural interface is nice and simple, but commits what I consider to be one of the cardinal sins - it blindly EXPORTs. This behaviour is fine for modules which are meant to be language extensions, but this isn't. Using EXPORT_OK is fine, but EXPORT should not be used.

And finally, looking at its internals, there are some inconsistencies and stylistic issues I don't like. Sometimes the module accesses data in references to hashes like '$foo->{wibble}' but in other places like '$$foo{wibble}'. And I find 'unless ... elsif' extremely hard to read. Perl has 'unless' because in some situations saying 'unless' is more natural than saying 'if not', but saying 'unless foo else bar' is unnatural and hard to parse.