There are some nice things about Mojolicious. It's simple to use, especially when one's goals are simple. But then there are serious problems:
- The authors regularly and rapidly break backward compatibility, often for trivial changes, and even on minor releases. The word "deprecated" shows up in the Changes log almost as much as the word "the."
- Route building is poorly documented, non-declarative (changing the order of statements can change the route map), and buggy. Certain route statements may exhibit undefined behavior, trigger unhandled exceptions, or just fail silently.
- The authors uncompromisingly choose to reimplement existing CPAN solutions for Mojolicious's internals, all for the sake of having no non-core dependencies. The result is a suite of pure-Perl modules with idiosyncratic interfaces and no automatic usage of available XS backends.
- The primary author, Sebastian Riedel, has a long history, across multiple projects, of responding to community feedback with angry rants and personal attacks.
These problems had me looking elsewhere. Fortunately, the nice parts of Mojolicious aren't particularly novel: straight Plack, a few Plack::Middleware, and Routes::Tiny will cover it.
It works, I guess, but the distribution adds little value to mere LWP, funnelling everything through AUTOLOAD without request-validity checks.
Works as described, effortless to use, and free of strange side effects. Would be nice if module versions could be specified. Otherwise, huzzah!
This module is very young at the time of this review, but it's already a brilliant improvement on the great SQL::Abstract, filling in feature gaps like LIMITs and column/table aliasing.
The only part that makes me uneasy are the facilities for table joining, which is just as stringy as straight SQL but has its own, idiosyncratic syntax. Perhaps allowing for "-on" key-value pairs would be nicer and more consistent with the OO interface's overall style.
I look forward to seeing the TODO features filled out!
MooseX::ABC is well put-together, but it appears to be a partial reimplementation of Moose::Role. That's not to say a role is just another term for an abstract class, but rather that it's not at all clear why one would want to use an abstract class instead of a role, or what MooseX::ABC can do that Moose::Role can't. If there are advantages, the documentation should have some explanation.