Reviews by Ron Savage


Const-Exporter (v0.2.3) *****

I'm delighted it was so easy to start using this module.

Tree-Persist (1.02)

I've updated Tree::Persist (V 1.03), including:

Implement user-specified class names for deflation/inflation of objects.

See t/load_from_file.t and t/save_and_load.t for sample code.

Lastly, I have to say the previous review is quite nasty, giving 1 star (and no I did not write that version of the code). The code works perfectly, and just lacks a specific feature. An email to the maintainer (me, Ron Savage) would have been a much more civil choice of communication).

Lingua-EN-GivenNames (1.00)


The pages weren't copyright when I downloaded them, as far as I could tell.

Also, it would help if you explained exactly why the interface it poorly designed.

I do admit it's a complex matter to accurately represent all the information in those pages. Dealing with that was the hardest part of this work.


GraphViz2 (2.04)


The high number of unknowns are due to the test for 'dot', and since it's absent, the test code emits an instruction to install Graphviz, so things are nowhere near a bad as they seem. This is the danger of modules which reply on alien packages. I have not attempted to incorporate using Alien::*, since I assume CPAN testers do not want Graphviz installed without their knowledge.

I suggest you just install Graphviz and then GraphViz2, and run the tests yourself. I only release a version if all test work on my Debian laptop.


Date-FromToday (0.05)

I'm with the previous reviewer.

And if the venerable DateTime seems like too much overhead, use the delightful Date::Simple.

So, I'm sorry to say this module is pointless.

The display on which says no dependencies is false, perhaps stemming from the Build.PL file which specifies Moose => 0.

Set-Array (0.26)

I'm the maintainer, not the author, of this package.

This review is to warn you of unexpected and dangerous behaviour of some methods in Set::Array. Consider this code:

#!/usr/bin/env perl

use strict;
use warnings;

use Set::Array;

# -----------------

my($a1) = Set::Array -> new(qw(a b c d e) );
my($a2) = Set::Array -> new(qw( c d e f g) );
print "Before: ", join(' ', sort $a1 -> print), "\n";
my $difference = $a1 -> difference($a2); # Overload $a1 - $a2 has the same effect.
print "After: ", join(' ', sort $a1 -> print), "\n";

Even though $a1 is the invocant in the call to difference(), the value of the $a1 set is changed by this code. The output is:

Before: a b c d e
After: a b

I believe this to be a terrible design defect in the code, and recommend you use Set::Tiny instead.

My review of various array/set handling module is at:

IPC-RunExternal (0.02)

Why write this module when we're already using Capture::Tiny?

HTML-Template (2.9) ****

Well, HTML::Template has served us well for a long time. It does the job nicely. I don't think the criticisms are justified.

The Template Toolkit I find just a bit too big, slow and complex to bother with.

These days, Text::Xslate has, IMHO, replaced these, and (essentially) all similar templating modules.

Data-Stack (0.01) *

To Christian:

I can only draw your attention to
<a href=" Principle of Least Surprise</a>

It's a good guideline on how to avoid bad interface or implementation design.

To Ben:

No, I don't think it's a joke module. You might be thinking of a stack simply using my(@stack), etc.

However, when the stack (arrayref) is an attribute of an object of a class, it becomes a bit painful to be always doing:
my(@stack) = @{$self -> stack};
push @stack, $new_data;
$self -> stack([@stack]);

Vastly better is $self -> stack -> push($new_data).

So, having a rational module, like Queue::Base, to manage something like this, makes sense. Or at least, it ought to make sense.