Reviews by Michael Stillwell



Froody (42.005) **

Froody in the abstract seems great--I like the idea of being able to build and use XML database structures by example, especially--but when you get down to using it, Froody proves unexpectedly troublesome.

Even though the documentation seems fairly comprehensive, it's actually not terribly well cross-referenced, which means that it's often very difficult to find the information you're looking for. (There's also a mistake in the 42.005 QuickStart documentation page which makes some of the examples not work at all.)

The error messages are also very poor--in most cases if something goes wrong you what get appears to be the same stack trace multiple times, where most of the referenced methods are internal to Froody itself.

Aside from these faults, there's the problem that Froody frequently behaves in an unexpected manner. For example, suppose you have a method "foo.example", defined in The package that implements this method might start out like this:

package Foo;

use base qw(Froody::Implementation);

sub implements { Prototype => "foo.example" }

sub name { return "Clem"; }

sub example { return "Hullo, " . $_[0]->name }

This, however, DOES NOT WORK--you can't call the name() method from example(). Despite appearances, at the time name() is called, your object is neither of type "Foo" nor "Froody::Implementation" (it's a Froody::Invoker::Implementation), so the name() lookup fails.

This is both unexpected (because it looks like the object is derived from Froody::Implementation) and annoying (Foo can't be a derived class of anything else).

I think Froody is both pretty new, and not widely used, so perhaps it will improve in the future. There's some nice ideas buried in there, and some clever code, but it presently rather troublesome to use.

SOAP-Lite (0.60) **

The manpage suggests that you use SOAP::Lite like this:

print SOAP::Lite

-> uri('')

-> proxy('')

-> f2c(32)

-> result;

which is alarmingly different to the conventional way of doing things, which would be something like:

print SOAP::Lite->new(

uri => "";,

proxy => "";


(RPC::XML has a much more sane interface to web RPC stuff.)