Reviews by Shlomi Fish


Module-Install (1.16) *

Trying to build and contribute to Module-Install-based-modules caused me no end of grief and frustrations in the past due to trying to chase dependencies, and lack of usability. Furthermore, Module-Install was abandoned recently and is now under-maintained and non-recommended and one should no longer use it. A better alternative would be the newer and better Dist-Zilla and I'm still using raw Module-Build which is also quite decent for some of my older CPAN distributions.

URI (1.67) *****

A very nice module! Highly recommended and useful.

CGI-Minimal (1.29) *****

CGI-Minimal provides a ligthweight alternative to, works, and works very well. I use it for some CGI scripts. Also look at PSGI and Plack for a more modern approach to doing server-side scripts in Perl.

Parallel-ForkManager (1.03)

This module helps a lot with the management of forking processes, while providing a convenient interface. Highly recommended. The other comments here are nice too.

Dist-Zilla-Plugin-Test-Compile (1.112820) *****

Great Dist-Zilla plugin. Easy to use, convenient, well-documented and a time-saver. Highly Recommended.

Eobj (0.23) *

I really don't see the point of this distribution, not when it was created and especially now when more capable object systems such as Moose, Mouse and Moo are present. The interface provided by this module is quite silly and it gives you only a subset of Perl's object oriented capabilities.

While Eli is a friend from the Haifa Linux Club, I would not recommend one to use Eobj.

Text-CSV (1.21) *****

This module handles the neaty gritty details of outputting and reading CSV files, which vary in the exact details of their format. One should definitely look into using it instead of parsing CSV using custom code and probably in an error-prone. Highly recommended.

Inline (0.50) *****

This module is great and allowed me to easily write some tests for the core C code of Freecell Solver ( ) more easily than if I used XS. I had some problems with gcc misbehaving and creating shared libraries which still had missing symbols, but this is not Inline::C's fault and I was able to diagnose and fix the problem using "CLEAN_AFTER_BUILD => 0" (see for more information).

This module still requires knowing some of the functions from perlapi, but it's still much better than writing it directly using perlxs.

Devel-Trace (0.11) *****

Devel-Trace has proven instrumental in debugging some code. It does one thing and does it well. One may wish to look into Devel-Trace-More, which provides a superset of Devel-Trace's functionality (note: I didn't try it yet).

Test-Simple (0.98) *****

This is a very good module - and a must for every one considering doing Test-Driven-Development with Perl.

Test (1.25) *

As Dan noted, this module's ok(...) function is inconsistent and badly designed. This module is no longer recommended and you should use Test::More instead, which is better in any way.

(I've written a script to convert scripts to Test::More, which might help you. You can find it on my home-site.)

HTML-Template (2.9) *

I agree with Evan Carroll that HTML::Template is archaic, purposely encumbered, and furthermore. it has gone unmaintained. Template-Toolkit is really superior in any way and should be used instead.

HTML-TreeBuilder-LibXML (0.12) *****

HTML-TreeBuilder-LibXML is a life-saver: finally something that combines the HTML-TreeBuilder interface and XML-LibXML, and gives one XPath in a sane way and does not use lame stuff such as XML::XPath.

Now all we need is something like jQuery or HTML::Zoom and we will reach the Perl XML/HTML parsing nirvana. You may also be interested in my WWW::Mechanize::LibXML , but that's kinda a hack, and I feel that WWW::Mechanize should make a more integrated use of LibXML, XPath, HTML-TreeBuilder, etc. under the hood in the built-in distribution. (If I only had the spare cycles for everything I wanted to work on, but naturally feel free to offer a small bounty.)

Text-VimColor (0.11) *****

I had some hairy code to colour using gvim, which kept popping up some gvim windows and interrupted my flow. Then I switched to this module, and now there are no popups, and my code is so clean it's not even funny. Highly recommended for all your vim colouring needs.

SVK (v2.2.1) *

SVK has been end-of-lifed and deprecated and is positively dangerous. Here I've given my story of what I had to suffer through to rescue my data from the clutches of SVK which kept it all in the localhost and wouldn't propagate it to the main repository, and could receive zero support from the SVK developers:

Stay a clear mile away of SVK. There are already better distributed alternatives and you can always default on the plain Subversion. But SVK should be avoided.

Exception-Class (1.29) *****

Exception::Class is a great CPAN distribution. I've been using for a while (and now co-maintain it), and was looking for something less magical (or even "black-magicke") and less of a leaky abstraction, and Exception-Class turns out to be a great solution.

The syntax for defining many exception classes is great, and it is also provides a convenient syntax for trapping and analyzing the excepions, which does not use closure games like does.

In short: don't use - and use Exception-Class. I should note that there's (and some other Method-Signature-like hacks) which may be worth to take a look as an alternative to the "use Error qw(:try);" syntax, but Exception-Class is naturally a complement.

Devel-Cover (0.64) ****

Devel::Cover is an indispensable tool in making sure that your tests have good (hopefully close to 100%) test coverage. I've used it successfully for several projects and it's a great tool. My only problem with it is that it makes the code runs much slower, which detracts from its usefulness. But otherwise, it's very good.

SVG-TT-Graph (0.12) *****

This module provides a convenient interface for creating several types of SVG charts of high quality. If you're looking for a charting module, check it out.

local-lib (1.004003) *****

Very good module. Convenient, has very few dependencies and gets the job done. If you're looking to install CPAN modules under a prefix, under say your own home directory, look no further than local::lib. I have done my own custom and ad-hoc hackery and found local::lib to be much more convenient and straightforward.

Highly recommended.

Test-WWW-Mechanize-Catalyst (0.51) *****

As advertised, this module provides Test::WWW::Mechanize and WWW::Mechanize-like functionality for testing Catalyst-based applications. I used it for Catable, the Catalyst-based blog engine, and it proved very easy to use and along with the documentation of Test::WWW::Mechanize and WWW::Mechanize, documented enough.

I do wish that it was possible to view all the available methods without having to look at those of the sub-classes in separate tabs, but I guess you cannot have it all.

In any case, if you want to test your Catalyst application, check this module out. It's much more powerful than using Catalyst::Test.

Class-XSAccessor (1.03) *****

I was able to shave 40 seconds (and 33%) of run-time by converting File-Find-Object from Class-Accessor to Class-XSAccessor. This module is fast, easy to use and does the job.

Devel-NYTProf (2.09) *****

Devel::NYTProf is an absolute life-saver. Finally, a decent profiler for Perl code. I used it to profile File::Find::Object, and never looked back at Devel::DProf or the rest of its half-baked ilk.

If you're using something else, then make sure you check out NYTProf.

Task-Sites-ShlomiFish (0.0201)

Since I'm the originator of this task, I'm not rating it. It's also not really a review but rather a rebuttal for all the criticism I received for putting this Task here.

First of all, I should note that the source code of my site is public, and I give detailed installation instructions here:

One problem with that page is that the remote Subversion repository has become out-of-date because SVK refuses to propagate my local changes to it. This is a misbehaviour of SVK which I'm trying to resolve or work around, but that is besides the point. (I have provided an old snapshot of the trunk and will upload a new one).

So people who are interested may wish to download the site's sources, play with them and learn from them.

Furthermore, the sources of my site serve as a sophisticated example for Latemp ( ), Website Meta Language ( ) and other technologies. So there is some public motivation to make installing its CPAN dependencies as easy as possible.

I'm sorry that I have not made all these facts clear in the module's documentation, but I still feel that all the heat I received was uncalled for.

After I said that, let me note that it is my opinion that if we don't want to have CPAN "contaminated" with modules that are of little public use, then we should implement a secondary sources mechanism in which will allow configuring remote sources with their own indices, which will provide different packages to what CPAN provides. Such mechanism will also allow organisations to set up repositories for their own private use.

Last time I raised the idea, someone objected and nothing was done to take it forward. I'm willing to work on implementing it myself assuming there's enough interest and that I'll know my effort will not go to waste.

Tk-JComboBox (1.14) *****

I needed to do a small Tk project, and the client wanted a combo-box. After looking at a different module (now no longer available separately), which was poorly documented and which I ran into problems with, I converted to this module.

Tk-JComboBox provides a combobox with a convenient interface and many helper functions. I did not run into bugs, and seems very nice. If you are using Tk and want a combobox, then this module is a life-saver.

Net-Google-Calendar (0.95) ****

First post! I'm not aware of any other module on CPAN to interact with a Google calendar. Nonetheless, this is a good module, and is recommended.

The only downside is that I found the documentation a bit confusing and lacking. For example, the "::Event" documentation does not show how to set up a date for an event. But the documentation is still complete and you can figure it out eventually.

DateTime (0.45) *****

DateTime is the king of date+time management modules on CPAN. It's easy to use, comprehensive, with very good documentation, lots of auxiliary modules and extensions. Don't leave home without out.

You should use it instead of doing your own date calculations by hand.

CPAN-YACSmoke (0.03) *

CPAN-YACSmoke hasn't been maintained in over three years (as of this writing), has many open bug reports that weren't dealt with, and its tests broke with a recent libwww-perl (= LWP) upgrade. I would recommend against using it and to look at CPANPLUS-YACSmoke instead, which is actively maintained, not as buggy and should be superior.

ack (1.86) *****

Ack is a must-have tool for programmers. See my review of it here:

Since then, it has greatly advanced. Kudos to petdance and the rest of the Ack developers for making such a great tool.

Template-Toolkit (2.20) *****

Template Toolkit is the king of the templating systems on CPAN. It has everything and then some - is very convenient, very intuitive and very powerful. Everytime I have to use HTML::Template in someone else's code, I keep missing the power and usability of Template Toolkit.

I can highly recommend Template Toolkit for all your templating needs. Don't settle on a lesser template system, because you'll eventually outgrow it.

ANSIColor (1.12) *****

If you ever wondered how to use colours in the terminal in order to highlight information, look no further than this module. It accomplishes it in a portable, easy to use way with a convenient interface.

Some case studies I did:

1. - colour the summary line of the test results.

2. - colour arbitrary regexes in log output.

Expect (1.21) *****

This is a great module for manipulating a console application programmatically. It is useful for testing, automation and many other uses. Highly recommended.

String-ShellQuote (1.03) *****

Beginning Perl programmers may be tempted to do somethings like `ls $dir` or `ls "$dir"` or `ls '$dir'`. However, they all pose security risks because one can put shell characters inside. While system (@args) and open, "|-"/"-|", @args provide a partial solution to the problem, you still sometimes need the shell for help.

The String-ShellQuote module provides a good way to escape arguments for inclusion in shell commands for safety and robustness. It has a simple and clean interface and its use is highly recommended.

XML-Simple (2.18) *

This module is an abomination. XML was not meant to be represented as a Perl 5 data structure in the way XML-Simple does. It should be named XML-Evil instead.


1. Sometimes uses arrays and sometimes uses hashes. How it decides that is inconsistent and error-prone.

2. Doesn't always generate identical XML when reading and writing.

3. Doesn't handle <p>Some <b href="url.tld/">markup</b>; inside text</p> properly, which is what XML is all about, and its key differentiator from YAML/JSON/etc.

4. Has many quirks and does not scale well.


I have a policy against helping people with XML problems. If you're looking for a good XML processing module look at XML::LibXML along with XPath, and possibly XML::LibXSLT.

OpenOffice-OOBuilder (0.09) *

This module does not handle Unicode properly, and it has monolithic functions, so it's impossible to fix by inheritance, without duplicating a lot of code. This makes it a non-starter. It also generates the older .sxc format instead of the newer .ods format.

Instead look at OpenOffice::OODoc which is an excellent module.

Locale-Hebrew (1.04) ***

The licence of one of the files here is iffy and unclear and may not be open-source. Instead, I suggest you look at Text::Bidi which has a more comprehensive interface, and is based on the fribidi library.

Test-Trap (v0.0.21) *****

This is a great module. Using it I was able to refactor the tests of the Test::Run suite and reduce the size by 273 lines. The interface is excellent and very convenient and the module just works.

One tip is that you should use the following "use" statement:

use Test::Trap qw(
trap $trap

In order to make sure Test::Trap traps the stdout and stderr of external programs invoked by system() and friends. This wasn't clear from the otherwise helpful documentation.

HTML-Tree (3.1901) *****

This is a really great module for doing HTML processing. I worked with it for a project for a friend, and then as part of WWW::Search, and I found it extremely convenient. It gets the job done quickly.

The documentation is very good. If you find this module useful, you should also look at HTML::TreeBuilder::XPath which extends the power of HTML::TreeBuilder with XPath expressions.

XML-RSS-Aggregate (0.02) *

This module is unmaintained and no longer works very well. The author (and I) recommend that you use XML::Feed now.

XML-Feed (0.07) *****

I have several blogs. Now, in order for them to be syndicated in a certain Planet, I was instructed to aggregate all their feeds into one feed. At first, due to the constraints imposed by the Debian Woody that my remote system had, I used an Evil hack with a patched XML::RSS::Aggregate, a patched XML::RSS module, and lots and lots of evil logic.

Now I converted everything to using XML::Feed and just upload the RSS feed to the server (which is Sarge now). My code is so clean it isn't even funny. I've also used XML::Feed to syndicate my home site blog as news on my homepage.

5 Stars.

HTML-WikiConverter (0.23) ****

It took me exactly 5 minutes to convert a HTML page to MediaWiki format using this excellent module. My only problem with this is that it converted Bolds and Italics to ''' and '' instead of <b> and <i>, which MediaWiki also support. I'd rather it had an option to use these kind of markups instead.

It's still a great module.

Mail-Webmail-Gmail (1.03.1) ****

This module is very convenient. I used it to remove mail from a mailing list mailbox where I have tons of undesired messages, to the trash, without having to issue multiple commands in the gmail web-interface. My only problem with is that the interface requires a bit of discovery (IDs vs. Messages handles, etc.)

Highly recommended for all Gmail users.

XML-RSS (1.05) *****

Wonderful module. I used it to output and parse RSS feeds, starting from code someone else wrote, and was able to get it to work very well. This module now powers the Israeli open-source community events notices propagation and syndication mechanism.

Keep up the good work!

IO-All (0.33) *****

A wonderful module. Makes dealing with Input and Output very convenient, and concise. Highly recommended. The only problem I found with it was that it has a lot of documentation and it was hard for me to find there what I wanted. (caveat: I contributed a patch to it).

libwww-perl (5.803) *****

Excellent modules! It helps dealing with the myriad of protocols of the web very well. A must for anyone who considers doing web automation and processing from Perl.

Xmms-Perl (0.12) *****

Excellent module for interacting with XMMS. I used it to write a "Now-Playing" handler for X-Chat. This way whenever I execute the command "/nowplay", one sees a "/me is listening to My Artist - My Song" message in the current channel.

Keep up the good work!

XML-LibXML (1.58) *****

This is a great interface to the XML DOM (Document Object Module). The only problem I can think with it, is that some of its settings are not per-instance, but this is the limitation of the underlying library.

In any case, this module is highly recommended for all of your XML processing needs.

XML-LibXML-Common (0.13) *****

This is a great interface to the XML DOM (Document Object Module). The only problem I can think with it, is that some of its settings are not per-instance, but this is the limitation of the underlying library.

In any case, this module is highly recommended for all of your XML processing needs.