Ratings and Reviews for CPAN


Rate a distribution

Find a distribution you would like to review:

Recent reviews (RSS feed)

Algorithm-Permute (0.12) *****

The functional (callback) interface is just what I wanted — ‘run this block of code once for each permutation of this array’. Couldn't be simpler.

The documentation could make this clearer though; you have to skip past a bunch of OO stuff to see it.

Net-Braintree (0.27.0)

This module has now been deprecated: support.braintreepayments.com/custome... Unfortunately, since the release contains no real documentation, this very important change in status has basically been left undocumented.

If you dig deeply enough, you'll find that it's documented _not_ in the README, but in README.md

It looks like the hosted Perl documentation has moved to developers.braintreepayments.com/java...

Color-Mix (0.02) *****

I think this module will be helpful for building a color theme for emacs, terminal, and other tools.

It did not calculate colors in the way I was expecting, but this was just my own ignorance. I had to learn a bit about color theory today to understand this, but the tools I have used in the past worked on the old traditional RYB color wheel. This has nothing to do the hex color being specified in RGB. Using the RYB scheme, the complimentary color of red is green.

The documentation is very explicit that it uses the RGB color wheel, but that didn't mean anything to me at first. Using that scheme, the complement of red is cyan.

At first I was convinced that the color schemes generated by Color::Mix were not as nice as the ones I generated on RYB. But after looking at a lot more samples, I think this is similarly nice, and will solve my problems.

Term-Menus (2.92) *****

I have searched for a while for a menu module and finally found Term::Menus. I am so glad when I tried it. It is neat and clear. Although I haven't got it all work out, Brian has given me a lot of help.

I am using to organize the test scripts I have. So each menu is a level of categories I organized the scripts into and the last level of menu will have the scripts listed and choose one will run the scrips.

Say I have some scripts to run GUI tests and some to run Package tests, I then list GUI and Package in Menu_main and choose GUI will go to Menu_GUI, there lists the scripts for GUI tests.

I haven't got all the feature provided in the great tool as some parts I couldn't get it right but so far it is the best. Hope I can figure them out soon.

Most important, Brian stand behind his code. Really appreciate all his time for helping me learn his great tool!

Git-Repository (1.313) *****

I commonly use this module:

my $git = Git::Repository->new( work_tree => getcwd );

$git->run( add => $options->{file} );

$git->run( commit => '-m', $message, "--date=$commit_day" );

$git->run( 'push' );

very useful to make things done!

Date-Holidays (1.01)

The idea is good, but a couple of things prevents me from using this interface.

First, the use of TryCatch (which brings the Moose ecosystem) makes the startup overhead too high for my taste (about 0.5s on my PC). Which is rather unfortunate because Date::Holidays itself does not use Moose.

Second, the interface assumes that a country has a single set of holidays, which is too restrictive in some cases. A more flexible/general interface would allow adding more calendars based not only on country but also religion, special community, organization, etc. And allow adding custom calendars.

Furl (3.07)

@Kira S (I wish cpanratings adds a feature to comment on a review):

Comparing WWW::Mechanize with Furl is not really apples-to-apples, since Furl does not support parsing/following links or form processing. As the Furl POD itself suggests, Furl is positioned as a faster alternative to LWP, not WWW::Mechanize.

Math-Permute-Lists (1.001) *****

Despite the scary-looking test results (currently, 89 passes/300 fails for version 1.001), this proved to be an excellent module.

I had the exact list of permutations I wanted to have after less than 2 minutes of finding this module; simply by writing this: permute { push @permuted, join '.*?', map quotemeta, @_} @bits;

Much simpler than the convoluted `glob` code I had.

The interface is simple enough to get you up and running simply by glancing at the SYNOPSIS.

Well-deserving of 5 stars.

Furl (3.07) *****

After benchmarking all CPAN HTTP solutions and being a very long user of WWW::Mechanize; I ended up choosing Furl. Among 20+ contenders, it was among the top 5 in speed, and with a very low memory footprint. It was also the one who croaked the less over thousands of random urls.

Because it is lightweight compared to Mechanize, much more quicker, and it handle a lot of things automatically that Curl and others low levels HTTPer do not (Multiple Redirects detection hell anyone?).

Support with HTTP::CookieJar, nice simple interface, and just works. Documentation is a bit terse, but if you are familiar with LWP or Mechanize you should be fine. Used in production for external webscraping and as a Rest API call.

A time/life saver and a well deserved 5 stars.

Arigatou Tokuhiro++

Win32-CLR (0.03) *

I never could get this module to compile. We did some research and are working to get Win32::OLE to work with .Net assemblies.

Mojolicious-Plugin-PDFRenderer (0.08) **

Seems a nice idea in theory, but in practice I ended up mucking around it for awhile before I even got any decent output that doesn't result in timeouts from workers.

I understand the problems lie essentially deeper down the tree of what this module uses under the hood, but indirectly, the module inherits the issues along with the code:

1) A couple of simple pages that I tried to render as PDF resulted in workers dying due to time outs. A 3-screen page takes several minutes to render even after I increase heartbeat timeouts—definitely not something I'd have available for use in production.
2) I found the above is largely rectified by using wkhtmltopdf version 0.9.9 instead of the current, but the plugin doesn't let you specify a different path to the executable
3) Using Bootstrap (and anything similar) results in the output rendered as if it were displayed on the "extra small" screen, even if you set giant page sizes.
3) Plugin generates a ton of 'uninitialized value' warnings
4) There are no options to allow PDF generation on only a few routes instead of ALL of them.
5) The docs mention you can pass options to wkhtmltopdf, but it's not too clear how to do it, and even when I managed to pass some, I got errors from wkhtmltopdf telling me the option I passed is in the wrong place.

In summation, I'd like to quote the current docs: "Then go to yourapp:3000/any/route, take a good look, then go to yourapp:3000/any/route.pdf. Cool, huh?"... yes, pretty cool, but offers little practicle value.

MetaCPAN-API (0.50) *****

very good implementation, thanks

Daemon-Control (0.001006) *****

What a great module!! You can even control multiple daemons from the same script!

IPC-System-Simple (1.25) *****

Instead of repeating the error handling of system-calls over and over again in your code, just use this simple module. Thanks!

Pod-Markdown (2.002) *****

I'm using it for generating the README.md for GitHub, and I find the pod2markdown script perfect for the job. Haven't used any fancy POD option, but the results seem pretty convincing so far.

Capture-Tiny (0.28) *****

Great module, easy to install, easy to use - and it does what I am expecting. I am using it to capture the output of a system call (converting pdf-files with ghostscript).

Catalyst-Runtime (5.90085) *****

Very nice software design.

Path-Class (0.35) *****

I can't imagine trying to work with file systems without Path::Class. I often use the same scripts on both Windows and *nix machines, Path::Class keeps me from pulling (the rest of) my hair out. I find the documentation easy to understand, so it was quick for me to pick up and use with little trouble.

SOAP-WSDL (3.003) **

This project has a lot of work to be done.
Documentation is still difficult to follow.
The interface is somehow confusing.
It is not clear if the project is hosted on SourceForge or Github, so it is difficult to submit a issue.
Also, there are a lot of no answered issues in rt.cpan.org.
You definitely want to look for XML::Compile::SOAP for a Perl solution with you need to build/consume SOAP web services.

Digest-Crc32 (0.01) *

Apart from the issues raised by other reviewers, note that this module failes to set the :raw IO layer within filecrc2, so it generates the wrong CRC.

String::CRC32 and Digest::CRC are recommended and seem to work fine, although String::CRC32 is faster by a factor of 1.6 when passed a file handle.

cmpthese(-10, {
'Digest::CRC' => sub {
open my $fh, '<:raw', 'rld-ctos.r00';
my $digest = Digest::CRC->new(type => 'crc32');
my $crc = $digest->hexdigest;
'String::CRC32' => sub {
open my $fh, '<:raw', 'rld-ctos.r00';
my $crc = sprintf '%08x', String::CRC32::crc32($fh);

Rate Digest::CRC String::CRC32
Digest::CRC 37.6/s -- -39%
String::CRC32 61.4/s 63% --

SQL-Tokenizer (0.24) *****

Thanks for a module! It's save my day!!

use Modern::Perl;


WHERE RT.FRST_CCY_ID = 751 and RT.CCY_ID = CL.GRP_CL_ID and CL.CL_SCM_ID = 61 and RT.EFF_DT >= '01.08.2005' and (CL.END_DT = '31.12.9999' or CL.CL_ID =1004)";
my $sql2 = " SELECT AR.*








AR.AR_TP_ID <> 1467 AND



use SQL::Statement;
my $parser = SQL::Parser->new();
$parser->{RaiseError} = 1;
$parser->{PrintError} = 1;
my $stmt;

use Test::Warn;
use Test::More;
my $msg_err_or = q{Can't use OR in an ON clause!};
my $msg_err_ref = q{referenced but not found in FROM list};

for my $sql ($sql1, $sql2) {

my $ret = warnings_like {

eval {

$stmt = SQL::Statement->new($sql, $parser);

printf("( %s => %s ) \n",

, '', join(',', map { $_->name } $stmt->tables()));



[qr/$msg_err_or/i], "warnings: $msg_err_or";

if ($ret) { #change OR на END

$sql =~ s/OR/AND/xmg;

my $ret2 = warnings_like {

eval {

$stmt = SQL::Statement->new($sql, $parser);

printf("( %s => %s ) \n",

, '', join(',', map { $_->name } $stmt->tables()));



[qr/$msg_err_ref/i], "warnings: $msg_err_ref";

if ($ret2) {

use SQL::Tokenizer qw(tokenize_sql);

my $remove_white_tokens = 1;

my @tokens = SQL::Tokenizer->tokenize($sql, $remove_white_tokens);

my $paren_depth = 0;

my $cache = '';

my @tables = ();

for my $i (0 .. $#tokens) {

if (($tokens[$i] eq 'FROM') or ($tokens[$i] eq 'JOIN')) {

push @tables, $tokens[$i + 1];



say join ',', @tables;




Software-License-OrLaterPack (0.003)

For the record, I've implemented a similar feature for Debian by adding a summary and a "or_later" option to all GPL classes. See
anonscm.debian.org/cgit/pkg-perl/pack... and anonscm.debian.org/cgit/pkg-perl/pack...

Unfortunately, I did not think it could be useful outside of Debian, so I did not create a new distribution (or proposed a patch to RJBS).

Google-Checkout (1.1.1)

This was a really well-structured dist which made interfacing with Google Checkout very easy. However, following Google's decision to withdraw the Google Checkout service this module has become instantly obsolete.

It is a shame that all the hard work which went into it was useful for only a short time. For authors thinking about writing a similar dist for other payment providers this legacy code would provide a great example of one way to go about it.

Tie-Cache (0.21) *****

Very easy, very nice API to add a cache with a count limit. I looked around for other APIs but this package provides the best for my count limit cache requirement.

I use orisacache syntax like this

my $cache;

tie %$cache, 'Tie::Cache', {MaxCount => 100};

while ($something) {

my $value = $cache->{$key} ||= $obj->expensive_lookup($key);


I dinged the documentation as it does not show hash reference and orisacache examples.

I dinged Ease of Use as it was an absolute pain to build this package into an RPM with cpanspec and not have it pull in Tie::Cache::LRU as well.



Pod-POM-Web (1.20) *****

Over the years I have lived with various Pod browsers. They all had shortcomings (navigation confusing, navigation slow, too much index detail, too little, ugly CSS, no CSS, it just died on me, …).

So finally I'm delighted to have found Pod-POM-Web;- (a) it just worked out of the box, with none of the above problems (b) it has found me stuff I never knew I had, and taught me useful things.

Declaration of interest; I have no connection whatsoever with the author of Pod-POM-Web

Competence: I'm a lambda user