Reviews by adam


Path-Tiny (0.104) *****

Path::Tiny is truly awesome. The API has everything you need, and it's just so *easy* to use.

We use it extensively to replace all the file reading/writing, copying/moving, directory traversal code; it makes the code simpler and more robust - what's not to like?

Dancer-Plugin-Auth-Basic (0.011) **

I appreciate that basic auth sends passwords in clear(ish) text to the server, but this module insists that you store the passwords in cleartext in your config too!

Maybe md5_users, bcrypt_users or something in the config?

Scriptalicious (1.16) *****

Just enough framework to make your scripts sysadmin-friendly :-)

JavaScript-V8 (0.06) *****

Thank you for this module!

I initially found it hard to install the required libv8 (no rpms for centos, brew on osx didn't work), and the 0.06 release would not compile on perl 5.8.8.

Got the latest code from github and all was fine and dandy - there seems to be quite a bit of work going on at the moment fixing compilation problems.

The docs are slightly misleading - binding a scalar hashref or string/number doesn't work, however binding anonymous subs works fine, as does returning structured data from the js context.

The headline, however is that it was 10x faster than Javascript::SpiderMonkey at the task in hand (loading jsv.js, registering ~80 json schemas from individual files and then running json schema validation), taking ~2s rather than ~20. Once the context was up and running, subsequent calls into it were lightning fast ( as little as 0.006s to run a validation vs a non-trivial schema )

Storable-AMF (0.88) *****

Excellent, fast AMF creation, excellent documentation and test coverage too.

Use in conjunction with AMF::Connection and you're well on your way to flash remoting!

Object-Tiny (1.06) *****

Object::Tiny is. Tiny that is :-) It only generates read-only accessors, but the interface is *far* cleaner than Class:Accessor:Fast, it's easy to override and is just absolutely yummy.

It's better than Class::Accessor::Fast because:
* perltidy and text editors (and me) loathe the extra curly to use a hashref for object creation as it takes two extra lines and an extra level of indentation. The data has to be copied anyway, so Object::Tiny's constructor is no slower than CAF
* mk_ro_accessors syntax is ugly
* Profiling with NYTProf shows the accessor properly (eg Object::id vs Class::Accessor::Fast::__ANON__[Class/Accessor/] )
* All those extra entries in the symbol table from CAF upset me.

WWW-Facebook-API (0.4.14) *****

Thank you for this wonderful module. Easily extensible (we added support for notes with no problems), worked pretty much first time.

Would be nice if the thrown Errors were more structured, as we just get a string out. But it's a minor problem.

WWW-Contact (0.20) **

Seems to work for gmail ok. Hotmail is currently broken (they put up a captcha for the /mail/PrintShell.aspx?type=contact request, by the looks of it), broken too.

Looks like Hotmail have a beta RESTful API:

This module has working support for gmail, but the dependency on Moose is a pain.

Pod-Simple (3.07) ****

TBH I'm just using this to auto-generate pod using the batch script - a simple perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go /path/to/your/modules output_dir works fine.

We've used the cpan-tastic css sheet recommended by John and it's lovely. Unfortunately it only splits modules on a single level, so we get 90% of our modules in one big lump. Otherwise, highly recommended!

ack (1.80) *****

Lovely grep -r -alike tool. In daily use here too. I like the way that "ack foo | grep bar" reverts back to including filenames on each line to make it more usable, and also that it skips .svn dirs.

Ack FTW!

XML-GDOME (0.86) **

Obsolete module - only works with a single version of GDome, which is now out of date. I suggest using an alternative XML library, eg XML::LibXML.

HTML-Tidy (1.06) **

As above, the module may be nice but fails tests. I believe this is because the tidylib has been updated but the perl module hasn't kept in step.

The problem in the test is due to the address tag in HTML - AFAIK it can't be nested or have a <center> tag inside it but an older version of tidylib allowed this, and the enclosed test tickles this particular case quite hard.

Installed OK from source after compiling tidylib from source (CVS, 25jan06) and tweaking the venus.t to take out the extra address tags.

As per previous commenter, it's a reet pain that you can't specify parameters in any sane way and have to put them in an external file.

You basically get two methods: parse and clean.

parse takes a dummy $filename first parameter, which is a bit odd - it will only parse strings, and $tidy->parse( $string ) doesn't work. It returns true even if there are errors in the HTML, which is also odd (truth is based on the success or failure of being able to get libtidy to look at the string)

I found the following code to be useful, but it does use a the private _tidy_messages interface...

my $errs = HTML::Tidy::_tidy_messages( $html );
if ($errs) {

print "there were errors\n";

#$errors is a listref of strings

The clean() method is much more sensible. my $cleaned = $tidy->clean( $html ); works as expected and returns the cleaned HTML (even though the docs say "Returns true if all went OK")

SVN-Notify (2.51) ****

Docs are a little sketchy - no mention of HTML::ColorDiff in the perldocs, for example.

Would be nice to have a sensible example post-commit example using the available features, eg

svnnotify --repos-path "$1" --revision "$2" \

--with-diff \

--svnlook /usr/bin/svnlook \

--user-domain \

--to \

--subject-prefix [SVN] \

--subject_cx \

--strip-cx-regex '^trunk/' \

--handler HTML::ColorDiff \

--svnweb-url 'myserver/websvn/listing.php?rev=%s'

ColorDiffs aren't quite as nice as cvsspam - it doesn't highlight differences within a line.

Otherwise very good - thanks a million!

Test-MockDBI (0.61) ***

Useful, but limited.

Forced logging to stdout with no way to turn it off. No support for connect_cached or any of the hash fetching functions (eg fetchrow_hashref).

Interface is basic - the docs more or less encourage you to explicitly set the sql you're waiting for and return a fixed value when it is run. It *is* possible to do regexp matching on sql and return the result of a coderef, but it doesn't pass the sql to the code, so its use is limited.

The code is readable, but indenting is off, and it "use"s Data::Dumper twice :-)