Reviews by Lee Goddard



TryCatch (1.003000) *****

Superb try/catch implementation that really helps make Perl function like a real, readable, useful programming language like Java - the type-constraints are especially welcome.

It does lack support for a 'finally' clause, which is a shame, and it is sadly bloated by dependent on Moose, but although those are long-standing issues with this module, I do hope they will one day be resolved.

DBD-Ingres (0.53) *

Giving this module 1/5 for 'overall' might make me seem ungrateful, but I am not - I am glad I can use DBI to perform basic operations. But DBD::Ingres does not support RVs from procedures, and does not document db_events; what is more, it blows up when a NULL value is SELECTed, due to an inability to map to a Perl type.

You'll also find some badly-handled DBI errors that you'd probably not see with a more popular DBD such as DBD::mysql. For example, "Preparing sth sth_report_result DBD::Ingres::db selectall_arrayref failed: E_LQ006B The SQLDA field SQLIND for column 1 should be a non-null pointer. [for Statement..." or "DBD::Ingres::commit(DBI::db=HASH(0x824140)) invalidates 2 active cursor(s) at .../mytest.t line 185. DBD::Ingres: Attempt to execute a statement after commit at ...sun4-solaris/ line 1595" - that latter in response to a 'commit' that should work.

Ingres 9.1 is a horrible database to work with, and this module *does* make it a little easier by providing a Perl interface for some tasks.

pQuery (0.08) ****

An interesting module if you like both jQuery and processing HTML on your server.
Would have been useful, for me, to have the CSS selectors released under another cover.

OpenOffice-OODoc (2.125) ***

There are not many ways of accessing OOO docuemnts without resorting to parsing raw XML, so this module was a welcomed find. For simple tasks, it performs well. For more complicated tasks, if performs reasonably only if you can make you way through the badly-formatted, unintuitive manual, a task made time-consuming and frustrating by the peculiarity of the API. Who would guess that to parse a spreadsheet without unexpected results, one has to call a normalizeSheet method in a class named Text?
With a new API, this module could be great. As it is, it is functional.

Spreadsheet-ParseExcel (0.59) *****

I have been using this module since it first appeared, on a variety of platforms - Solaris, Winodws, OS X, Ubuntu, Debian. The job is usually a simple extraction of the contents of an XLS document, so perhaps I have not pushed the module as far as it could go, but it has served faithfully, without any problems at all. Many thanks to the author.

local-lib (1.008004)

Looks to be a very useful module, but on OSX, after installing, and running the cpan command, and going through cpan config questions with default answers, cpan attempts to install Try::Tiny into /Library, rather than $HOME.

Image-Epeg (0.12) ****

A thumbnailer based on the superb, and very, very fast Epeg code from the Enlightenment project.

If you can get this working, you will have the best thumbnailer Perl can manage.

However, you will have to read the perl source code of the module to discover things not in the POD, and you won't get any explanation from the module as to why it fails to create a new object from an existing and valid file.

Catalyst-Log-Log4perl (1.04) *****

Seems to work pretty well but is limited by being API-compatible with Catalyst - so no TRACE level, no LOGWARN, etc.

Catalyst-Runtime (5.80032) *****

I imagine if you are reading these reviews, you are new to Perl, otherwise you have already come across what in the past few years has become the Perl-standard MVC framework.

Do not be put off: check CPAN for the step-by-step tutorials, which are clear, well-hyperlinked, and come with extensive samples, which show you how to build a Catalyst web-app from the bottom up.

If you have used Spring or Ruby or pretty-much any other implementation of the MVC pattern, you should have a functioning Catalyst application with ORM, authentication, authorisation, and session-management within five hours.

KinoSearch1 (1.01) *****

* Clear, well-written and comprehensive documentation.
* Clear API, familiar to Lucene users
* Very easy to use, shallow learning curve: comes with a sample app that should allow almost anyone to get a search engine running in under 20 minutes
* Relatively fast: certainly faster than any Perl search engine I have tested

If for some reason Lucene is not an option, KinoSearch is a fair fall-back.

KinoSearch (0.313) *****

* Clear, well-written and comprehensive documentation.
* Clear API, familiar to Lucene users
* Very easy to use, shallow learning curve: comes with a sample app that should allow almost anyone to get a search engine running in under 20 minutes
* Relatively fast: certainly faster than any Perl search engine I have tested

If for some reason Lucene is not an option, KinoSearch is a fair fall-back.

Spreadsheet-WriteExcel (2.37) *****

Allows the easy manipulation of XLS files without resorting to Microsoft technology. Superb documentation, intuitive API, functional in almost every feature.

Time-Simple-Range (1.2) *****

Clear and simple API, operates without issue.

Plucene (1.25)

Only after writing a review here did I realise the module was deprecated in favour of Kino Search. And yet, nine twats have taken the trouble to mark what was an empty review as 'unhelpful' - pure perl.

Lucene (0.18) *

Documentation is sparse, but the API mirrors the well-docmented Java original. However, my OS X build fails at the second hurdle with the message 'abort trap,' which is not documented anywhere I can see outside of the cpp source.
AFAIK, this module is deprecated in favour of Kino Search, which is not compatible with Lucene, but performs the same functions as well as any Perl module could - highly recommended.

PluceneSimple (1.04) *

Looked good, but fails to build (on OS X), and the link to the mailing list specified in the POD returns 404, and RT lists bugs six years old.

Pod-Spell (1.01)

The name Pod::Spell made me think the module ran a spelling-test on POD files. It does not - it just presents the POD, sans some jargon, for checking elsewhere.

Test-Spelling (0.11) ****

A fine spell-checker for POD except it relies upon the system having the 'spell' program. It also seems stop-words have to be included in the document being tested, and cannot be specified by the test itself.

MP4-Info (1.13) *****

Fast, reliable and simple. So far so, good - thank you.

WordNet-QueryData (1.49) *****

Works faultlessly and quickly. Note that at the time of writing, the WordNet dictionary files need to be downloaded from the full WordNet tarball, as not all files are supplied with the WordNet 'dictionary only' download. The author is also very helpful.

Lingua-EN-Infinitive (1.11) ****

Works, so long as you have a dictionary: "Either 1 or 2 possible infinitives are returned. You must check that the first is really an English word. If it is, then it is the result. If it is not valid, then check the second."

Data-Rmap (0.62) *****

Effective module that extends Perl's 'map' to recurs through complex data structures.

Test-Most (0.23) *****

Test::Most simply combines the most often used testing modules, and augments with some utility methods which you are sure to recognise if you have written more than a few cursory tests. The documentation is superb, which should, hopefully, help this module become the new standard for Perl testing, and remove much of the confusion present in so many highly-customised test suites.

Moose (1.19) *****

If you are thinking of looking into Moose, do so - see the above reviews for links to gentle introductions. This is the most important Perl extension to bring language up to date, to counter Ruby, Python, and friends, in lieu of Perl6. I don't find Moose helpful for most of the smaller and quicker jobs for which Perl is most useful to me, but for larger applications that I hope to live for years, and for which I cannot use Java, Moose is heaven sent.

Test-Fixture-DBI (0.07) ***

A promising module, but one which, at the time of writing, appears to require both MySQL and SQLite, though it operates on either.

Improved documentation, and separation into base- and sub-classes, would be much appreciated.

TAP-Harness-JUnit (0.32) ****

Works as hoped, and integrates seemlessly with Hudson CI.

More environment-based configuration would be useful for the CI scenario, but I hopeful that will turn up in the near future.

TAP-Formatter-HTML (0.09) ****

Handy module for pretty reports, can operate with minimum hassle, and although it has many options, it is dead easy to get going with none.

On long reports, it would be nice to begin with an HTML version of the traditional TAP summary, but perhaps I've missed that option.

Video-Manip (0.03) *

No idea what this is, or why it grabs top-level namespaces other than out of ignorance.

DateConvert (0.16) *****

Simple-to operate, relatively lightweight module that does an excellent job of converting Gregorian dates to Hebrew. Highly recommended, with great thanks.

Math-Geometry-Planar-GPC-Polygon (0.05) ****

Much appreciated finding on CPAN this wrap of the world's favourite/fastest polygon library, though some documentaiton would have helped - I suggest looking at the test file, or using the module via the much friendlier (and well documented) Math-Geometry-Planar.

Bundle-Math-Geometry (1.00) ****

A useful collection of Geometry modules, soem of which I had previously overlooked, so much appreciated.

Geo-ShapeFile (2.52) *****

The module is flawless, and a great way to quickly turn GIS into KML/PNGs with Perl (although for larger maps, I have found all Perl-based solutions too slow, and had to resort to ogr2ogr, PostGIS, or Clipper).

Image-IPTCInfo (1.95) *****

Have been using this module since its release, and never had an issue. The author is responsive and supportive. Not terribly fast, but coded such that it could become C quite simply.

GraphViz-DBI (0.02) **

Only graphs relations if you specify them, or implement the default pattern of foreign keys being table names with a "_id" suffix, which is nice but not present on all DBs you're likely to work on.

See GraphViz::DBI::General for a sub-class that uses table metadata to establish the relationships.

JSON (2.53) *****

Fast, reliable, and versatile without trying to be everything and please everyone. A fine JSON parser, reasonably documented, regularly updated, with a response and polite author - a rarer thing than it ought to be. Highly recommended.

Java-Import (0.03) *****

Straight forward, intuitive use of Java classes from Perl. Top marks and thanks! Now Perl geeks can talk to a real programming language....

NB: Dissing Perl guarantees a poor score for a review, not because it makes the review unhelpful, but because most Perl geeks are over-sensitive and should probably get out more.

DBIx-Class (0.08196) *****

Watching DBIx::Class grow up has been a lot of fun. Whereas once I would tentatively mention it to clients' lead developers, pointing out the terrible documentation and potentially unstable codebase, these days I happily point junior programmers towards it and expect them to produce good results within the day.

This is one of several packages that makes Ruby On Rails seem a complete waste of time.

Great work - thanks to all on the team!

Tk-Wizard (2.151)

Apparently there is now way to delete this text, and when the ratings are changed to undef, the DB is not updated.

Plucene-SearchEngine (1.1)

Deprecated in favour of Kino Search.

Geo-Google-PolylineEncoder (0.05) *****

A most welcome module for Google Map's encoded GPolyline objects. Clear interface and docs, but annoyingly, seems to require a hash as input: whilst this does avoid confusing latitude and longitude (which are sometimes in reversed order, in the world of Google Maps), it does often require re-coding data, with the consequential speed penalty.
As with most geo operations in pure Perl, it could be faster if written in C/XS, so whilst this module may be suitable for prototyping and toy scripts, it has proven much too slow for mapping applications on large datasets such as those on BBC Earth.

WWW-Search-TheITJobBoard (0.03)

Updated for the .com version of the site, since API has changed.

Zen-Koans (0.05) *****

A handy collection of koans in Perl, but without historical commentary or citation.

The default koan was written by the author, and is of debatable value: perhaps it would better be "Mu"?

DBD-SQLite (1.35) *****

Small, reliable, very easy to install, minimal dependencies, easy to use, neatly segregated, and very fast. Allows user-defined DB functions to be written in Perl! This module is a benchmark to which other module-writers should aspire. The integration with the already-beautiful SQLite API is sublime, the redistribution of the libs a refreshing change.

What's more, this is one of the very few Perl XS extensions that builds everywhere I use it.

Net-SFTP-Recursive (0.12) *

A potentially useful module for mirroring via SFTP, but flawed by an apparent typo in the source ($something || $another mis-typed as $something |\ $another), and a deep-recusion error, caused by directory listing not having '.' removed prior to recursion.

Author informed.

Pod-Parser (1.35) ***

Pod::Usage - Full marks for docs and interface, 4/5 for ease of use, but drops marks for releasing to CPAN code that does not run in taint mode.

Pod::Parser - rather straight-forward, which is much appreciated.

Log-Tiny (0.9b) **

To quote Log::Tiny's documentation:

"This module aims to be a light-weight implementation *similiar* to Log::Log4perl for logging data to a file."

It logs data to a file, through an OO interface.

As it is 'Tiny', it supports little of Log::Log4perl's complexity and suffers limited versatility as a consequence. No L4P-style ':easy' mode, so no saying "DEBUG" or "INFO." It does not appear to be possible to restrict output to a specific "category" of logging events, nor to a specific portion of an application. Logging to STDERR or STDOUT does not seem possible (though the author tells me it may be introduced in a later version).

To be fair, if you need a very simple (and tiny) file logger, this module may be of interest.

DateManip (5.44) *****

As other reviews note, Date::Manip is pure Perl, so slow, but extremely powerful. Very powerful business hours and custom-holidays features make it an excellent module for SLA processing.

Date-Holidays-UK-EnglandAndWales (0.02)

I wrote this module after using Date::Holidays::UK and finding it contained too few holidays, and claimed to represent the UK when in fact it represented only England and Wales, and ignored Scotland and Northern Ireland. I needed to extend the date ranges, and on two projects for two clients. Hence the CPAN upload.

Since then, I've read Date-Holidays-0.15 and will update this module's API to reflect that discussed therein.

Archive-Rar (1.93) **

This module offers the beginnings of rar archive support, but I found it easier to call system("rar",...), to which this module offers little added value.

Not ready for comparison to Archive::Zip. After all, rar is a proprietary system, but it would be nice to have a fully-documented wrapper of convenience methods (list contents, extract partially, extract paths matching regex...) and friendly English language options.

Image-Info (1.31) *****

Useful module for most types of basic image info (not metadata), even down to iterations in a GIF animation.

4/5 for GIF documentation: no mention is made of how to compute the duration of a GIF, though the source code suggests this is possible: call image_info in array context, to recieve an array of (partial) image_info hashes, sum the Delay key of each, and multiply by the GIF_Loop key in the array's first entry - and rewrite that code on every project.

3/5 for the ancient interface: would be nice to see an OO API, even if tacked on top.

Email-Simple (2.002) *****

Great to see Perl's e-mail handling getting a work-over: a nicely, clearly defined series of objects, with an fairly intuitive API, makes the everyday tasks of reading, processing, composing, posting mail a lot more pleasurable.


Date-Holidays-UK (0.01) ****

Very simple, fast, and easy-to-use module that exports a subroutine that will confirm whether a year/month/day is a UK holiday.

The downside of the simplicity is that the holiday dates only run until 2007, and don't go very far into the past. More data is available on the DTI site referenced in the POD.

Also note, these are English holidays, not really UK holidays. I have updated the module to include dates up to 2010, and uploaded it as Date::Holidays::UK::EnglandAndWales.

Acme-Bleach (1.12) ****

Makes perl source code appear to disappear: interesting reading.

Hidden feature: .pl uses .pm that uses Acme::Bleach, and .pl gets bleached too.

String-Diff (0.02) ****

Provides a straightforward means of comparing differences in two strings, and marking those differences in a chosen manner.

The module looses two stars, one for its documentation: a verbose Synopsis, but not explanation of how to get the advertised coloured terminal output.

The other problem is that the output of diff_fully: a list of tokens is a useful idea for me, but having several 'unchanged text' tokens in a row is something I would hope not to have to optimise away myself.

Overall, promises to be very useful.

Tripletail (0.29) *****

The documentation is in an Asian characterset, but the code is in English, which implies the author could translate the POD to the CPAN lingua franca.

Acme-Placeholder (0.04) *

More proof that Perl is the new COBOL.

WWW-Mixi (0.49)

Score is for documentaiton alone, which is not in English. I know there aren't many rules in the Perl world, but it might help to start introducing some about language namespaces (and maybe uploading placeholder modules, and reviews of placeholder modules).

Test-Reporter (1.57) *****

With so many CPAN modules duplicating so much functionality, and so many operating systems with so many idiosyncracies, the CPAN Testers provide an invaluable time-saving service by reporting on potential install problems and OS compatabilities.

Sending test reports has always been easy, if you could take the time to find, configure, and sometimes port, the cpantest script, tucked-away as it was on the site.

Test::Reporter wraps this script in documentation and places it where it has long-deserved to be.

The next stage is, hopefully, to have it distributed as part of the default module set, and configured with all installs of the language.

Perhaps the module might better have been named Test::Reporter::SMTP, so that those who detest e-mail as a transport mechanism would be free to implement their own modules to a Test::Reporter API.

Catalyst-Manual (5.9002)

Slightly disorganized, often grammatically erroneous, but contains all the information needed to understand and write Catalyst applications. A most welcome find -- and it is constantly improving, which is just as well, as responses to the mailing list seems to satisfy few people.

Apache-Test (1.29) *****

Apache::TestRequest -- it's the kind of module you've written many times, but don't have to any more now it's on CPAN. Fully documented, allows rapid development of tests against the Apache configuration and responses.

Sadly, hasn't been ported to run on a modern (2.*) Apache mod_perl server.

Comes as part of an impressive looking Apache::Test suite.

Test-NoWarnings (0.083) *****

First-rate module that extends the Test::* framework, failing tests that issue warnings.

Test-Image-GD (0.03) ****

This module uses GD to report whether two images will look the same, or not, ignoring what it calls "invisible differences" such as the order of colours in the pallette. Very useful. Hopefully the next version will tie in Image;:IPTCInfo for the testing of metainfo.

DBIx-Log4perl (0.07) ***

Only available for Perl >= 5.8.0, sadly, otherwise this would be 5/5. It simply logs some/all your SQL using Log4perl -- what a great idea, makes performance tuning much easier.

Module-Install (0.64)


"The above is obviously a mutation of the monumental speech by great Martin Luther King ( While the contexts are vastly different, I feel that there are some serious parallelisms."

-- Brian Ingerson

No, there are no "serious" parallels at all, just an offensive pastiche that cheapens an heroic moment. Please update it.

Otherwise a great module: reassuring to see the MakeMaker limitations being addressed, even if in parallel to other replacement efforts.

cpan2rpm (2.028) *****

Converts (most) CPAN modules to RPMs (mostly) without interferance from the user.

This script is so good, it ought to be built into MakeMaker so that I can make dist, make zip, make ppm, and then make rpm.

ExtUtils-MakeMaker (6.31) *****

Makes my life so much easier, I don't know where I'd be without it.

Does one thing, and does it (mostly) flawlessly.

Current version fails one of its tests on Win32 - sign of the times?

Gadabout (1.0002)

A Perl version of the PHP Vagrant graphing class. Pretty output (space saving overlays and trendy alpha layers) but sadly lacking in documentation. Might have been better placed in Graph::Vagrant, to make it a little easier to find.

Spread (3.17.3-1.07) ****

A welcome, functional module, sadly seriously lacking in documentation and extended features. The XS portion of the module seems flawless in my somewhat limited usel the perl API is just messy, with all sorts of exports going on, most of the listed in the POD without explanation. All error reporting is via an exported scalar.

For docs, see the website docs for the C interface, to which this is a pretty straight interface.

For extended features (daemonising, etc), try to compile Spread::Message.

In about six months of non-stop use, handling about 20,000 messages a day, the only real problem I've had with this module is its silly version number, which is in fact a string, and which all your usual MakeMaker-like $VERSION-detecting strings will ignore.

File-Copy-Recursive (0.29) ****

Copies directories of files whilst attempting to preservce permissions.

It's the sort of thing you've probably written many times, and never thought to put on CPAN. I'm glad it's here, because saving a little bit of time has helped a big bit.

The ancient non-OO API is horrible, but bearable in small doses.

Module-InstalledVersion (0.05) ***

This modules looks for a specified module file under @INC, and if found, applies the MakeMaker regex /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/

As the module observes, a lot of perl modules do not obey the perlstyle and other guides which recommend a version-numbering system compatible with the MakeMaker regex, and so a means of finding the version number even if it fails that regex would have been nice.

CPAN-Reporter (0.34) *****

This module adds to functionality to send test reports for cpan-testers: no more need to track down and install and configure Most welcome!

Catalyst-Enzyme (0.11) *****

Adds instant Class::DBI CRUD to Catalyst. Fantastically frank and clear documentation: well done.

UNIVERSAL-can (1.12) *

This moduel requires either GPG or Crypt::OpenPGP to install, but doesn't check for them, and there seems to be a bug in the latter, preventing UNIVERSAL::can from installing: the author has been informed.

'gpg' is not recognized as an internal or external command,
operable program or batch file.
Can't locate object method "all_props" via package "Crypt::OpenPGP::Key::Public::DSA" at C:/Perl588/site/lib/Crypt/OpenPGP/ line 25.

DBD-Excel (0.06) ***

A DBI database driver for Microsoft Excel-format files. Seems to work perfectly well with Excel-fomat documents. Does not support SQL joins or data type casting. Does not recognise formatting or images in the spreadsheet.

SPAM WARNING : all the author's links mentioned in the module's POD point to bogus, pop-up spawning adverts.

Dev-Bollocks (0.06) *****

Produces psuedo-random and almost meaningless text reflecting middle-management speak. Talks the most bollocks in the perl community, and that's saying something. If that offends you, you are probably either middle-management, or otherwise talking bollocks.

Text-Lorem (0.3) *****

Produces random text by the word, sentance, and paragraph - very useful when prototyping. Simple and well-documented.

HTML-GoogleMaps (10) *****

This module provides a simple and clear means of quickly producing HTML Google maps with plotted points. There's not much error-checking, and my initial install failed because the distribution did not check the version number of Geo::Coder::Google, upon which it depends, and which underwent a major API change between the time when I last updated my install, and the author of HTML::GoogleMaps wrote his module. With a little work, this module could turn into a useful utility.
Of course, this is not a recommended approach to working with Google Maps, but that is another story.

IO-CaptureOutput (1.03) *****

Quoting the POD: "This module provides routines for capturing STDOUT and STDERR from forked system calls .... [and is] able to trap output from subprocesses and C code, which traditional 'tie()' methods are unable to capture...."

It does it simply and successfully, and is highly recommended.

Apache-ClearSilver (0.01)

The RT queue for this module does not exist, so here's a note to the author: please add some documentation, defining the terms you are familliar with and use, but which lack a definition or implicit meaning in the context of your POD.

Wx (0.57) *****

GUI framework and widget library.

Better thought of as a cross-platform replacement for Win32::GUI than Tk, this extensive wrapper for the Wx C++ library comes with minimal perldoc, with the real docs being on its website Hence 5/5 for all but docs.

Pod-Usage-CGI (1.010) *

This module basically produces an HTML-wrapped and escaped Pod::Usage: quite useful in a busy day.

The module was born in an organisation stuck on the earlier version of Apache and mod_perl, and suffers as a consquence, naively assuming that any server with $ENV{MOD_PERL} can simply "require Apache". It can not[1]. As a cconsquence, this module will mess up mod_perl 2.*.

So despite a good module, a low score.


Jabber-Lite (0.8.1) *

Looked really good: simple, clear, pure Perl, but fails its own tests, so not suitable for the real world.

Net-Jabber (2.0) *

Doesn't pass its own tests on CentOS Linux, so I guess I'll not be using this in a medium-traffic international mission-critical application.

Test-WWW-Mechanize (1.38)

A well-documented, regularly-maintained member of the Test genre which provides methods as simple and straight-forward as those in Test/Test::More, for getting, posting, and testing web server responses.

However, this module is of little use when working with a modern, AJAX-driven site:

* Does not parse JavaScript, which is no easy task but increasingly important to testing AJAX-driven sites.

* Does not parse JSON.

* Does not allow HTTP methods outside of those listed in the HTTP::Request::Common module.

Caveat: some of my code uses an "import" routine, without using and its %EXPORT_TAGS-type variables. This causes WWW::Test::Mechanise to halt with compilation errors. This has just been reported, but is worth bearing in mind.

Test-LongString (0.09) *****

Contains string functions rather like the the 'eq' 'ne' 'like' and similar used by Test::* modules, but LongString's operate without outputting all of the string, so tests are easier to read.

I regularaly (at times, every minute, for hours on end) have to perform simple tests on large (>1 MB) multi-line docs, and until I learnt of this module, I spent a lot of time scrolling and using my editors 'find' feature. Test::LongString makes life a lot more pleasant, which definitely earns 5/5.

HTTP-WebTest (2.04) *****

Powerful and extendable web page/app/site testing suite. Although not complex, it is quite involved, and so is perhaps not suiteable for a quick-and-dirty testing. I thought about knocking a point off for its not outputting Test::Harness-compatible output by default, but then it is not in the Test namesapce, and it can output in the more "traditional" style when requested.

Clone (0.20) *****

Extension to add a 'clone' function to distinct copies of perl data-types. Written in XS, so quite, the module largely works very well. It messes up with DBI DBD handles (provoking "Can't call prepare method on handle DBI::db=HASH(0x25755c8) after take_imp_data()"), but when that is solved, it would be nice to have Clone as a core module.

Tk (804.027) ***

Perl TK is a vast collection of C/XS/Perl that allows the Perl platform to produce a TK GUI that will work on Windows, Solaris, RedHat, Debian, Centos, and probably most other OS.

It includes a large number of widgets, a comprehensive event model, and has a large and established user-base, with lots of mailing lists, usenet groups, and suport websites.

However, the documentation is sparse, and assumes a familliarity not only with Perl - which is fair - but with TK, which is perhaps not so fair. Much of the essential Core documentation contains sections marked 'TODO' and 'This Document Lacks...,' and has done for many years. This often leads me to a close examination of the source code, which is badly formatted, completely ignoring perldoc perlstyle in favour of what I presume is Tk style. What's more, Perl Tk experts are known to snottily "correct" the standard perlstyle of non-Tk extensions in favour of their own style.

Finally, the graphic output of Tk is extremely dated, and skinning is far from trivial.

If you cannot avoid Perl Tk, purchasing a book on the subject would surely be a good investment. If you can avoid Perl Tk, do so, in favour of a less antique.

See also: Wx

libapreq2 (2.08) *****

A long-awaited and much appreciated suite of Apache 2.0 modules, which I use simply to access POSTed data from mod_perl, but which does much more, including giving access to Cookies, file uploads, errors, hooks, and more.

With this fast and stable suite, in mod_perl is finally unncessary.

This review once made sad comments on the inability of this module to install via CPAN. However, the fault has been rectified, and a vast library of documentation has been added. Excellent work: 5/5.

Template-Plugin-XML-Escape (0.02) *****

A very simple, limited, but very useful filter that turns into entities XML's forbidden characters qw[ < " ' & > ].

RTx-Timeline (0.03) **

No documentation beyond a link to an external website that does not mention the module.

TV-Anytime (0.31) *

A series of objects created from a TV Anytime information tar ball, intended to accurately represent the contents.

This is a bare-bones package, providing just an interface to the above data in the above format. It does not support the prototype web API (, nor does it create a local cache, a database mirror, or supply any other application functionality.

Has a very long list of prerequisites and so many not sit well with some production servers.

Additionally, the module causes perl to crash without warning on my Win32 AS Perl 5.8.8. The lack of a debug feature makes this a hard problem to solve, not aided by the fact the modules supplied build tests do not test anything other than the POD.

The issue was tracked down to XML::LibXML failing without warning on the advised test data: removing the encoding specification from the XML PI in the test data solved that part of the problem. However, running the module's SYNOPSIS code on a valid TV-Anytime directory produces no output at all, nor any diagnostics, hence this review's low score.

XML-Diff (0.04) ****

This simple module use Algorithm::Diff to solve the non-trivial problem of producing XML "diff" difference reports in the XML format described at Although the author lists three minor caveats, the module works well for me. It would, though, be a benefit if the output/results were available as a Perl hash too.

This module states that it requires Perl 5.8, but at least passes its tests for 5.6.1.

XML-RSS (1.10) *****

A module full of promise until I needed to include 'special characters' in an RSS feed's descriptoin field. The module promised to escape them, which is not what I wanted, but instead it escaped just the left angle brackets, and not the right: not the simple solution promised. Report sent to RT.

Hash-Diff-Dispatch (0.01) *

A useful-looking module let down by negligable documentation. Supposedly executes code based upon the difference between two hashes, but does not explain how this is done, documenting only two methods ('new', 'update') even though the SYNOPSIS refers to two others ('off', 'on').

The author must have spent some time developing this module, as well as uploading it to CPAN, but that would be time better spent if it included five minutes on the POD.

Test-Exception (0.21) *****

Well-documented testing extension which provides a means of testing code/methods that intentionally die, without resorting to 'eval'.

Cairo (0.91) ****

An interface to the C library for anti-aliased vector graphics, which nice alpha-layer handling.

Installation on CentOS/RedHat is a hassle: Makefile.PL uses ExtUtils::PkgConfig but doesn't find my Cairo lib in /usr/lib....

Math-Zap (1.07) ***

Another pure-perl implimentation of 3d vectors that doesn't mention the dimensional restriction in its title. Reasonably well documented, and with support for the usual length/norm/normalise/dot-product operations.

Sparse (0.03) ***

Sparse::Vector: Documentation is non-standard, consisting of legal blurb and a big 'usage' section. Does support for the usual length/norm/normalise/dot-product operations. Implimentation is purely perl, and not terribly fast. However, if you amongst the thousands for whom PDL does not compile...

Math-Vec (0.04)

This module provides OO vector mathematics with vectors limited to a length of three. Which is so crippling it sounds unlikely, so perhaps the documentation and all the examples are very, very poor. Note the documentation suggests this code not be used in a production environent.

Acme-Terror-UK (0.03) *****

This module fetches from the website of the British intelligence service MI5 the current official "threat level" of the UK.

My gad, this like something from 1984....

As a previous reviewer noted, the timing of the release of this module makes you think...

The URI accessed is, and I think the quality of that URI conveys something about the state of the institution responsible.

Kwiki (0.38) *

I consider this VERY alpha software.

The POD is terrible: it refers to a website that runs the module, and doesn't work: "Software error: Can't find a class for method 'unlink' at lib/Kwiki/ line 143..."

I could go on, but that should give you the general idea that this software is not worth investing in for production.

A shame, because the module is heading in the right direction with plug-ins.

Template (1.21) *

This module has upset me. I thought I was getting of Template-Toolkit; instead I get this

Extremely rude to use someoneelse's namespace but in lowercase.

The author should seriously consider removing this module to another namespace.

Graphics-ColorNames (1.06) *****

This module provides RGB to/from English colour names. Kindly provides English as well as American-English spellings!

Chart-Clicker (1.0.1) *****

Yet another charting/graphing module, using yet another graphics engine.

Chart::Clicker is based on the Cario graphics library (, and as used by this module, produces some charts with beautifully-blended alpha layers and gradients.

Documentation is described as largely 'todo' since this young project is still in a state of alpha flux, but the interface looks sensible. Youth probably accounts for the lack of chart types currently available.

It would be nice to see some integration between ::Clicker and GD::Graph::Data, perhaps, but that is picky.

Overall, Clicker is certainly worth keeping an eye on as a replacement for quick-fix graphing currently provided by GD::Graph. It will not become as popular, though, until someone builds a Win32 PPD that includes Cairo!

Mail-Sender-Easy (v0.0.3) ****

The simplest yet interface to e-mail, based on Mail::Sender. Does better error checking/reporting than Mail::Sender, in less lines, which can be useful for debugging.

The author has fixed the platform-dependency bugs from earlier versions.

PerlMagick (6.24) ****

PerlMagick (Image::Magick) is the perl XS interface to the powerful, Photoshop-/Gimp-like image manipulation library housed at

Features include drawing routines, a huge number of filters - including a variety of user-definable kernel processors - TrueType font rendering, histogram extraction, profile- and metadata-manipulation, writing in a variety of formats.

Documentation in the Perl module is non-existant, and although it can be found on the web easily enough, it does not do the product justice. You may well find yourself reading the C API documentation to understand some of the functions, methods and arguments.

Error handling is most un-perlish, and should after the many years of this module's existance, have been improved.

Installation is always a pain in the neck: the Perl module requires you pre-install the binaries - on Win32l the PPM comes with the binaries, and not the other way around. Be sure to check you are using the correct 'quantum' version: Q8 is fast but Q16 provides more detailed understanding of colour.

In short, if you need to plot a few lines, use GD. If you haven't tried Imager (, give it a shot before investing your time in Imagemagick.

(Kuszi, Burak for the QueryFontMetrics tip: proves my point about the docs ;-)

File-HomeDir (0.58) *****

Provides locations of currently logged-in, or any other user's, home- and personal-directories, and thus removes the need for multiple-layers of checking in my own code. Simple interface and clear docs.

As yet, no interface for user "desktop" directories (it has been promised), but still a most welcome addition.

DateTime-Format-Human (0.01)

Funny module that renders DateTime in English phrases - so should probably not be named ::Human, but ::*::English.

DateTime (0.34) ***

Powerful date and time OO framework that provides the means to add and subtract dates and times, receive ranges of dates and times, and more - up to nano-second resolution.

Does not seem to understand the ISO-8601 as input, though that does appears to be the standard output -- to a degree:

The 'now' method defaults to UTC, which is confusing: I would prefer it default to the real-world time (including DST), since that would probably cover the majority of use cases.

Timezone parsing is not well documented, so intuative actions fail:
`my $t = DateTime->now(); warn $t - 1;` results in "Can't call method "time_zone" without a package or object reference." The "datetime" and "iso8601" methods do not output a timezone identifier at all, neither a 'Z' nor an offest.

But then the module is (after what seems like many years) still in development, so I am sure this will all be ironed out soon.

DateTime-Calendar-Hebrew (0.04) *****

Well-documented and apparently accurate, the author should be praised for his comprehensive coding and extensive documentation, as well as his explanation of what is a famously complex calendar.

Acme-Phlegethoth (1.02) ***** meets HP Lovecraft, for perl. If you don't get that, you won't get this module.

SVG (2.33) *****

Superb documentation makes this extensive pure-Perl SVG-generating module a synch to pick up. Comes with examples, manual, and a good set of external links.

If a module must be in the root namespace, then this one thoroughly deserves it.

Image-LibRSVG (0.07) ***

Installing this module, to convert SVN to PNG/JPEG/etc, requires the Lib RSVG 2.0 library. On my vanilla Debian terminal server, that involved downloading and installing (with yum, thankfully) 26 meg of assorted packages and libraries.

The Makefile.PL contains the `pkg-config --cflags librsvg-2.0`, which upsets me in two ways: it is not cross platform, and assumes librsvg has been installed as librsvg, which on Debian, it is not.

I'm finding it faster/easier to `rsvg` than use this perl wrapper.

PLP (3.19) *****

A well-documented, easy to build extension that allows Perl to be embedded into (HTML) documents, without the need to aquire yet another Perl subset.

It claims, and seems, to be as fast as PHP.

Of course, it comes with all the purist-arguments about the mixing of this and that, but if you need to embed Perl in a document, this is a very good option.

The big failing, though, is that it does not run with mod_perl 2.0.

Lingua-EN-Tagger (0.13) ***

From a non-academic, non-linguistic point of view, this module can return you some useful keywords/less common words from a block of text, and has proved useful in automated indexing and tagging.

However, be warned that it requires its input to be in memory, rather than from a file, which has implications for large bodies of text, since simply chunking the text and re-invoking will prevent the module functioning correctly.

Pod-Escapes (1.04) *****

A useful library for decoding POD escape sequences.

Whilst I'm unsure of the depth and bredth of the escape sequences covered, it does seem a shame that many of the 'standard' Pod::* modules (*::Checker, for example) duplicate work that now has it's own home.

DateTime-Event-NameDay (0.02) ****

A few years ago, I learnt that a name day is a religious event celebrated by Roman Catholics and inherited by their sub-classes. This module attempts to list the names associated with dates, for a number of European countries. Could be quite handy for interacting with those of such persuasions.

But 1/5 for Documentation: very lazy to put it on CPAN with the Usage section reading simply "TODO". And since the author is presumably not able to produce sub-classes for every nation's name-spellings, it might be a good idea to include a section of sub-classing.

Perl-Tags (0.23)

This module, Perl::Tags, introduces itself as a module to "Generate (possibly exuberant) Ctags style tags for Perl sourcecode." Which does raise the question of why it was not called "Vi::Ctags", since tags for the trusty and finger-twisting VIsual editor and its relations.

Lingua-Stem (0.82) *****

A simple, quick and easy module that reduces words to their stem: "asking" and "asked" become "ask" - though it is worth remembering that the stem is a symbol, rather than a grammatical construct, and as such is not always suitable for rendering.

Supports several languages other than English, and includes details on how to easily vastly improve performance for batch processing. Self-contained and a synch to install.

GD (2.34) *****

Perl interface to the widely- and (off Win32, easily-) installed GD drawing library.

A relatively lightweight module, ideal for line drawing, graphs,
charts, and adding notes to images.

The perl-porter is extremely responsive to genuine issues, but rightly advises those who install to read the relevant documentation - specifically, you may need to adjust paths in the Makefile.PL

For more fancy Photoshop-like image manipulation, see the heavier ImageMagick/PerlMagick.

The latest version of the Perl GD and the underlying C libraries supports alpha channels! This means I can now render semi-transparent, overlapping objects without having to load the mighty and weighty Image Magick.

FreeType support is extensive, to the point where interfaces are present for features that do not appear to work in the underlying libraries - useful if the C libraries get updated before Be aware that the latest FreeType text rendering is less aesthetically pleasing than it once was.

cwd (HASH(0xb8b72b4)) *

I think the version number should tell you a fair amount: HASH(0x875f270). The README file reads "...if this is still here the programmer is...lazy...".

The 'module' source code is actually this:

use Cwd qw(realpath chdir);


chdir join(q//, split(/.[^\/]+$/, realpath($0)))

or croak "cannot chdir: $!\n";


What a waste. And why is it a pragma?

My vote is to remove this from CPAN and modify the PAUSE source to make a case-insensitive check of existing module names.

GDTextUtil (0.86) *****

GD::Text utilities allow you to simply render strings to a GD object using TrueType fonts. It works well on Linux and Win32. A method is supplied to return the bounding box - the co-ordinates of the text were it to be rendered.

I have not tested the GD::Text::Wrap class in this distribution, but if it is as good as the GD::Text::Align class also in this distribution, I am looking forward to it. All of this weeks radar charts now curved text thanks to ::Align.

Only two issues I've had are a possible lack of UTF-8 support (it may be my mistake prior to rendering), and the inability to change the opacity of the rendered text.

XML-Simple (2.14) *****

Highly recommended for turning XML into perl and vice versa.

All aspects are highly configurable, although the default interface is so well configured you may not need to configure any further. If you do, the POD is clear and detailed (a rara combination).

The author is great: quick to respond, quick to fix bugs, and polite when pointing out operator error.

The only thing it lacks is support for "mixed content" XML, that is XML where elements contain both text nodes and other elemeents. As the author says in the POD, if it supported mixed content, it'd not be Simple!

Lingua-Ispell (0.07) *****

A perl wrapper to the international spelling engine, iSpell: very handy. Will tell you which words it didn't know, what it thinks they should be, or how it could be formed from a root.

This is not an XS interface, but pipes to ispell, which is not required by the makefile. However, if you don't have it on the path, you will get errors along the lines of 'unable to open ...' This is particularly hard for users restricted to Win32 without a C compiler, since there is no official binary build of iSpell. Such poor individuals may wish to examine Text::Aspell, which is an XS interface to GNU Aspell.

GDGraph (1.4308) ****

I have been using GD::Graph since it was released. It is clearly written, has a wide variety of chart types available either in the bsae distribution or on CPAN. It is very simple to use, and although the docs do not contain a clear Synopsis section, they do contain a clear tutorial and many tests/examples/demos.

Aesthetics are by definition subjective, and although GD::Graph can have most of its components adjusted (from colouring to spacing to fonts), it would benefit from a wider variety of styles in the tests/examples/demos.

GD-Graph-radar (0.10) *****

A functional radar graph, with the usual GD::Graph aesthetics.

Tests for v0.10 fail on Windows, but in cpan shell, it is okay to force.

CPAN (1.8802) ****

Used from the command line or via its own shell for searching for and installing perl modules. Requires almost no technical knowledge, and as such, a great way for end-users to bring limited parts of a distribution up-to-date.

Schedule-Cron (0.96) *****

Instead of using cron to operate perl scripts, try this module. It can take a crontab schedule from a crontab file or programmatically, and operate as if it were cron - but with the benefit of being perl. It can eval arguments, catch errors, has a logging callback, and of course much more.

In several years of using it, it has never let me down.

One caveat: you'll need POSIX::setsid implemented on your architecture -- which means you can't use this module on Win32.

TimeDate (1.16) ****

A generally useful module that covers a range of date formats, with support provided for a number of languages, by sub-class.

The documentation is apparently somewhat out of date: the POD reads as follwos:


will change the language in which all subsequent dates are formatted.

This is only a first pass, I am considering changing this to be

$lang = Date::Language->new('German');

$lang->time2str("%a %b %e %T %Y\n", time);

The methodology considered appears to now be in place, since the object methods described work, and the class method produces:

Can't locate object method "language" via package "Date::Format" ...

Sub-classing to provide support for further languages is a messy business, without suitable docs.

Also be warned that when the module says 'English', it in fact means 'American English.' This should be corrected, since MM/DD/YY is confusing to non-Americans who do not expect it.

The author did not respond to a patch to supply support for Hungarian so it had to be put up by itself.

Imager (0.53) ****

This module has the potential of being a reason to use the Perl language.

2006-08-04: Those restricted to Windows boxes be warned: the both standard AS and bribes PPD of this module supports no image formats other than : bmp rgb w32 pnm tga ifs raw. No JPEG, PNG or even GIF support. That means no loading or writing of the files you probably want to work with.

Wizard (0.1006) *

From the name 'Wizard' I expected a cross-platform, generic Wizard-applet building library.

What I got was a bunch of modules that don't declare their prerequisites, without enough documentation, largely documented in what I guess is Flemmish.

Top-level namespaces like "Wizard" should be restricted for Wizards. And since that is an English word, it would be polite that it be an English-language module, too.

Geography-Countries-LatLong (0.92)

The author writes: this is a rather old module, and these days are there are other public, free sources of latitude and longitude information. However, the module is to the best of my knowledge complete and accurate to three decimal places, which I rarely find elsewhere.

Regexp-Common (2.120) ****

Regexp::Common::profanity does not catch half the naughy English words I fed it, and can't be extended to cope with them. It would have been nice to know this before installing and testing, but I guess a list of naughty words in the POD is asking a bit much.

Not sure why the regular expressions are not created with qr// ...

String-Tokenizer (0.05)

I'm not sure what this module offers that the older String::Tokeniser doesn't, other than Americanised spelling in its name.

MPEG-Audio-Frame (0.09) ****

A pure Perl module that does not allow access to the decoded mpeg file, but does allow you to seperate and observe individual frames to measure their length and type. As a bonus, the author is highly responsive and knowledgable.

Devel-Carnivore (0.09) *****

"Watch" (log assignments to) a hash without the hassle of a debugger. Watch a hash even for CGI mod_perl scripts. Watching can be started in a number of neat ways, including simply adding "watch $this," and can be tunred off just as simply.

Brilliant - but what a strange name...?

Audio-Mad (0.6) *****

A wonderful interface to the MAD mp3 decoding engine, which has allowed me to get waveforms from MP3 files from Perl in a relatively short time. The documentation is not quite as verbose as you might hope, though if you have previous experience of the MAD library then you will no doubt find it quite acceptable.

The only problem I have is that it appears Audio::Mad::Stream cannot actually stream data from a file, but rather requires the whole MP3 in one chunk, which is rather obtrusive when dealing with radio documentaries or symphonies.

See also L<Audio::MPEG>, which also interfaces to MAD, but also requires LAME.

Inline (0.44) *****

I had a commercial project with a tight deadline, and found perl's number crunching far too slow. There was no time to read books or even very much POD.

It took about eight hours at the end of the week, one question to comp.lang.perl.misc, and a frequent search of perldoc perlguts to get a maths-based module up-and-running with Inline::C, after virtually no previous Inline experience, virtually no XS experience, and having last programmed C some six years previously.

Quite a testament to Inline::C's ease of use and extensive documentation.

However, I did have to Google a couple of bugs, and would like to see a more detailed diagnostic section to cover the apparently occasionally-required insertion of "Inline->init", to get Inline::C to see the __DATA__ section, as well as a section on packaging modules for distribution.

This module is heaven-sent, and I look forward to writing faster modules in the future.

Audio (1.029) *

The generic name "Audio::Data" suggests generic functionality, which this well-documented and cleverly-written module does not supply:
single stream audio makes it useless for most day-to-day applications, and the outstanding tickets (from 3 to 12 months old) do not offer much hope for future development.

Perhaps this module should be renamed "Audio::Data::Mono" or even "Audio::Data::Mono::$OS" where $OS is whatever architecture it does compile on.

'Audio::Data' is a great idea - perhaps there's a band of able and willings out there who could take it on as the major project it should be.

Audio-MPEG (0.04) *

This module offers frame-level reading and writing of MPEG audio files via full access to both MAD and LAME.

Unfortunately, it seems to fail to compile almost everywhere, and certainly here on a generic Red Hat box. After tinkering I belive one may have luck with the older version of LAME mentioned at the end of the Audio::MPEG pod - but perhaps not with a later version of perl.

So, if you have a set-up identical to the module author's, you have access to a very powerful module. Otherwise, stear clear.

Outstanding RT tickets of more than a year in age do not offer much hope that this important namespace will come back to life.

(It may help to know that Audio::MAD does seem to work.)

Tk-Wizard-Bases (1.945)

The author writes, to clarify Robert's somewhat outdated review:

Robert said: "it is designed as a MainWindow"
Author replies: Not any more. It now takes a MainWindow like any other widget does, but will create a MainWindow if one is not supplied.

Robert said: "Stylistically it looks like a Windows 95 or 2000 installation wizard, which is not appropriate for a wizard that occurs within an application and may bother or confuse some non-Windows people."
Author replise: Surely only Windows people are daft enough to be confused thus? But patches to ease skinning are welcomed.

Robert said: "Tests are not automated."
Author writes: Oh yes they are.

Robert said: "The documentation leaves much to be desired. It's sparse and recommends one look at the test case files."
Author replies: over 568 lines is much less sparse than most Tk modules.

Robert said: "It makes some assumptions about how wizards should work that are restrictive. For instance, there is no way to have both "Finish" and "Next" buttons in cases where the user can end early."
Author replies: "If you really want, please use RT to request."

Robert complained: "Also: E-mails to the author have bounced back."
Author says: um. lee-at-cpan-dot-org or use RT.

Robert moaned, "Sadly, this is a case where an otherwise excellent module has a lot of issues that make it too restrictive for my needs."
Author bitches back ;) "Sadly a case of a reviwer not making an effort to either communicate with the module author, nor to update his reviews."

File-Where (0.05) *****

A straight-forward and not-too-heavy way of finding a Perl module, or other file. The example included in the POD could use some work, but still: a very useful module.

Language-Prolog-Interpreter (0.021)

This module is yours for the taking, if you seriously want to have a go. I inherited it and don't have any time to PROLOG these days, sadly.


PDF-EasyPDF (0_04)

Potentially useful compact PDF generator, lacking any text-flow.

typesafety (0.04)

Perl becomes Java....

CAM-PDF (1.06) ****

Manipulates PDFs, not just creates them. Comes with lots of examples so it is relatively easy to get up-and-running.

Text-PDF (0.27a) **

The author has presumably spent a lot of time on what is a rather complex business. But the distribution is let down by lack of documentation and examples. No README, no Text::PDF object as the obvious entry-point. With a little work, this has the potential to be a very useful module.

PDF-API2 (0.55) *****

If you want to produce PDFs, and have to use Perl, use this module. Sine it's initial release, I have found it to be easy to use to produce simple documents, over every aspect of my PDF creation, from image contact sheets, to relatively complex tabulated data. Top notch!

I should add, though, that using this moudle is not a two-minute job. The documentation is extremely sparse, and assumes you know not only PDF but also PDF::API2, and will take some time to penetrate. If you are not familliar with printing/print-layout and PDF terminology, you will probably need a glossary, since the object-orientation closely mirrors these two fields.

My big problems with this module begin with text flow. The latest version of the module suddenly required Perl 5.8.*, and unexpectedly replaces the old text-rendering without warning, leaving piles of code in need of updates. The replacement methods do a quite poor job at rendering blocks of text, and are almost undocumented. There is no way to render a block of text with inline font/style changes. There is no way to render columns. All of those things you'll have to do yourself.

Finally, the mailing list is actually a Yahoo! group, and has all the associated accessibility problems.

But if you are patient, this module can produce very pleasing results that are usable on an increasingly-wide number of platforms.

Pod-Pdf (1.2) *****

This module creates what I consider the most beautiful output of any POD processor.

I used to think it could not produce multi-page PDFs: in fact, I updated it to use File::Find, added some more features, and then discovered the hidden (?) "include" feature. In your POD, use the "include" directive followed by a relative file path:


=include AudioNotes/

Be warned, though, the the TOC will not list the contents of the NAME section, just that it is a NAME section.

Sub-classing this module is problematic because of the unconventional internal Perl style: lots of global variables, some arguments passed between subroutines which are ignored. It uses neither "conventional" Pod translation modules nor PDF output modules, which at least shows the author to be an expert PDF coder.

Does not support the (newish?) level three and four headings.

The author is unresponsive, and the module appears to be unmainted. [I have written 90% of a simillar module based on regular and proven CPAN modules that can create a book of POD, with table of contents and index, but I am unsure about releasing it to CPAN - should not Pod::Pdf be updated, instead?]

Test-Simple (0.98) ****

When you write a new process, module, class, interface, method, function, subroutine, program or script, you need to know it works. As the project grows, things almost invariably and inevitably need refactoring. Test::More provides a simple but powerful way of writing test scripts to ensure the integrity of your code through this passage.

Simple and more complex comparative assertions such as "is", "isnt", "is_deeply", and simple integrity checks such as "ok" and "isa_ok" produce a standard output, compatible with the older Test module, as well as the Test::Harness.

If you haven't tried this module, you really ought to give it a go: the clear and friendly tutorial can almost guarantee that you will be happily using the module on production code within the day, and within a week you will see your productivity improve no end.

It used to irk me that the error reporting read "...called at file.t line 248" which differed from the default perl output for (apparently) no good reason, and messed up all my editors; but that small price to pay has now been remedied by the helpful, if somewhat less than graceful, author.

Log-Log4perl (1.10) *****

Intuitive, simple to impliment, easy to override, hidden depths of power and flexability, wrapped up in a clear and well-documented object model.

You can get up and running in seconds, but know that because of the module's rich feature set and built-in extensibility, your application will probably not outgrow this module.

Logging to the screen, logging to a filehandle, logging to files, appending to files, in any number of formats: the built-in sprintf functionality of pattern layout means that log files become legible and almost pleasurable!

Logging can be performed at different levels (as in Apache logging), optionally with different actions set up for each level. Logging can be turned on, off or restricted to specific packages or to errors above or below a specific level, through adjustment of either a configuration file or Perl value. And wonders of wonders, it is simple to configure different logging levels for different Perl namespaces.

Plus logging to a simple callback for database inserts.

And what's more, the author is very helpful.

A rare 10/10: a module that makes me unusually proud to program in Perl.

RT-Client (0.01)

Almost no documentation, and as a consequence it's a pain in the bottom to use. Being free to use is no excuse for poor docs. Ended up using LWP::UserAgent which did the job quickly.

Error-Unhandled (1.02) *****

Looks very very useful, but can I trust it in production? It'd be nice to see some reports here of how it has been used.

Image-ExifTool (6.00) *****

Fast, reliable and amazingly comprehensive - if you need to read Exif info, this is the module for you. Added value in the 'composite' fields, which will return a useful value regardless of in which proprietary field it appears.

XML-RSS-JavaScript (0.5)

An interesting looking module but without a sample of the javascript output, hard to judge if it's what I need.

RT-Integration-SVN (0.03) ***

Documentation is in the README file. Doesn't *seem* to cope with multiple repositories.

PAR (0.90)

No comment, just a request that this module refer to the App::Packer::* suite and perhaps even does a comparison/benchmark...?

App-Packer (0.12)

No score, just a request that this module refers to the PAR::* suite - and maybe even does a comparison/benchmark...?

XML-LibXML (1.58)

This 'review' is actually a comment: the distribution *will* install on RedHat (and Solaris) if you apply the patch supplied by a guest at:

Hopefully one day it'll make it into a release.

Finance-Currency-Convert-Yahoo (0.2)

The author apologises...

Robert Rothenberg - it does now use the CSV method of which thou hast spake.

Image-MetaData-JPEG (0.141)

In addition to the IPTC info editing offered by the older and reliable Image::IPTCInfo, this module offers access to other forms of metadata - EXIF and PS info.

Is it faster for IPTC info? I would like to see a comparison of benchmarks.

RTx-Foundry (0.01) **

Immature, only running on FreeBSD, but looks promising, and nice to see it on CPAN.

Test-Pod (1.22) ****

Excellent, useful module that with Test::Pod::Coverage, can generate extremely useful reports on documentation.

My only gripe is that it isn't OO, but I guess that's just style.

DBIx-CGITables (0.001) ***

A potentially very useful module that is too young and undeveloped to be of any practical use. The documentation-writing seems to have been cut-off mid-flow. A shame, since PHPmyAdmin is not something I wish to install.

When the manual editing of the schema.dd is done away with, and when foreign keys can be identified in a 'new' manner, I'll try again.

Rose-HTML-Objects (0.52)

At the time of writing, doesn't come with a description.

What is it?

Date-Simple (3.02) ****

A good idea to have a very light-weight and quite fast date module that supports so many rich features (arithmetic, various formats).

One niggle: dates can be made from 2005-12-06, but not 2005-12-6. It'd be nice if it did indeed produce a Date object, but I'd settle for a warning... It's only a niggle, but I write it here because I use this module in almost every project.

DBD-Oracle (1.17) ****

A real pain to install, but worth it.

Don't look upon the install as setting up just another perl module: look on it as (a) bringing the wonderful world of Oracle to your snuggly perl nest (b) helping you avoid other, nastier languages (c) increasing your day rate.

Read the README and POD, and then Google.

*** You will need Oracle client libraries on the machine for which you're installing this module.*** You can use the Oracle CD or get free copies from their site.

HTML-Template-Pro (0.56)

Looks very interesting but sadly lacks benchmarks against Template Toolkit or Mason.

Archive-Zip (1.16) *****

Makes zip file manipulations of all kinds a piece of cake. The only drawback I've ever found with this module is extracting an archive tree when running in taint mode.

perl (5.8.7) ***

Too many modules are "unreviewable" because the CPAN page that contains the review link is actually the CPAN page for Perl itself.

Switch (2.10) ***

An excellent and extremely versatile switch/case that I would use all the time if it did not completely confuse the Perl interpreter's idea of line numbering. Introduction of this switch makes debugging a nightmare, throwing off all line nubmer reporting in the module in which it is used.

Carp-Trace (0.11) ****

Would be nice to ssee an illustration.

HTML-Tidy (1.06) ***

This would be a Blessed Module indeed if it did but compile on any system on which I slaveth. Oh, woe, for lack of the time that may allow a Sensible, nay, Noble, corrective contribution from your humble scribe. Alas, alak.

That was June.

Now's it's three months and one thousand miles later, and I've been reduced to RedHat, where it compiles. It just doesn't pass the tests. Wonder what'll happen if I force it...?

So far so good, my noly "issue" is that currently configuration options have to be loaded from a file; there is not yet an option to set them at the time of construction, which is a shame.

WebService-CIA (0.01)

Why in the WebService namespace? The POD makes no mention of XML or SOAP or anything WebService-related. Wouldn't it be happier in WWW::*? Or even Secret::Service::*?

CGI-SSI (0.87) *****

Just what I need!

Does an excellent job of solving my perennial SSI-in-templates problem.

Author's very helpful, too!

Embperl (2.0.0)

perldoc Embperl describes the package as "Taglib for sending mail" - is that all it is...?

HTTP-DAV (0.31) *****

A useful and well-documented module that doesn't seem to get much attention, presumably for its lack of DeltaV support. Despite this, the lack of simple access to a "last status" code, do not be put of by the last-modified date of the package.

Time-Piece-ISO (0.10) *****

Thank you, Mr Wheeler; an extremely useful module that works perfectly.

ZM-SSI (0.0.5) *

This module is in a stupid namespace, has minimal documentation, and doesn't perform the task it claims to.

SVN-Churn (0.02) ****

The documentation is sparse and uninformative, lacking definitions and explanations of core concepts such as the 'database' and 'URI'.

SVK-Churn (0.05)

Problems mentioned in this reveiew have been resolved, but too late for the reviewer, who has not since needed such an SVN overlay as this.

SVN-Notify (2.46) *

Looks like just what I need, and great docs, but doesn't install on RedHat and the deadline is, as always, too tight to allow fixes

Log-Accounting-SVN (0.01)

Yes, but what is server accounting?

Games-Sudoku (0.06) ****


I detest Sudoku.

Therefore I like the idea of running this module on my PDA to annoying those annoy Sudoku-playing Gaurniad readers.

The POD is ugly, though.

Win32-GUI (1.02) *****

Fails to install on Debian! What on earth were you thinking, releasing software that doesn't support....

Only kidding.

This is a great module, in both senses of the word, and makes it a breeze to write little GUIs for Winodws-trapped end-users - see also PAR -

UNIVERSAL-exports (0.03) *****

So good, it should be a standard pragma....

perl-ldap (0.33) *****

Thank you, Graham. They think I'm brilliant because it took only hours for me to migrate our Active Directory to OpenLDAP!

(Nice direction for a migration, eh?)

Very easy to use module, saved me a lot of work.

Pod-XML (0.93) ****

This handy little module saved me trouble of embedding XML into my otherwise beautiful POD for a client who has written one program - a XML-comment extractor - and insists his contractees use it.

The output format is far from what I want, but as the author points out, XSLT make conversion extremely simple.

mod_perl (2.0.2) *****

If you need to run a website which uses perl, it is worthwhile looking into having part of your site served by mod_perl, which increases the effective operational speed of your perl by pre-compiling the perl with an interpreter "embedded" in the Apache webserver.

There is a lack of paper documentation for the Apache 2.0 mod_perl, but the POD has improved tremendously in the past few years, the website is not at all bad, and there are plenty of helpful mailing lists around.

HTML-Sanitizer (0.04) *

Looked so good, so very useful, so nicely documented: but doesn't pass its tests, and there are year-old tickets suggesting it never will.

Such a shame that such a lot of hard work can't be used here.

Or do I mean, such a shame that a lot of hard-work has to be redone here?

Mail-Sender (0.8.13) *****

Beautifully easy to use; easy to install anywhere. The best day-to-day mail sender module.

If you have never before sent e-mail with perl, copy-and-paste the examples from the POD and you'll be up in minutes.

Pod-HtmlHelp (1.1) **

A great idea, let down by the author's busy schedule, it seems. A shame ActiveState haven't thrown so dosh at it.

XML-Xerces (2.5.0-0) ***

Hard to rate this module: if you manage to get it going, it'll be the most useful XML tool you can get in Perl. On the other hand, the lack of documentation is a bit of a bind.

XML-Tidy (1.2.54HJnFa) ****

Excellent little module for re-parsing files.

It does sadly appear to inherit an issue from XML::XPath, but it is documented.

However, XML::Tidy is not comparable to HTML::Tidy, which the name does rather imply: no correction of mismatched 'tags' is attempted. Perhaps XML::Pretty would have been a more informative name.

Use of "&&" instead of the word "and" in the documentation rather irked me, too: forever asking folk to read perldoc perlstyle now seems pointless....

RTF-Tokenizer (1.08) *****

A very useful addition to CPAN, which allows the parsing of Rich Text Format files rather in the manner of HTML::TokeParser.

Seen a few problems with parsing of RTF "prolog" sections, but as of yet, I am not convinced this has anything to do with this module.

Text-Replace (0.07) *

The fullest and least explanative documentation I have ever seen.

A triumph of verbosity over usefulness.

If anyone has a useful, very fast templater to replace $foo with &bar in a very large file, please mention it here.

Image-Timeline (0.11) ***

An excellent module, just what I need, but may need a little work - either on the axis or the docs:

use Image::Timeline;
my $t = new Image::Timeline(

width => 400,

date_format => '%c',

$t->add('Test 10', time-(60*60*24), time-(60*60*24*7));
$t->add('Test 2', time-(60*60*24), time-(60*60*24*2));
$t->add('Test 12', time, time+(60*60));


open OUT,">timeline.png";
binmode OUT;
print OUT $t->draw->png;
close OUT;