Why use Moose? A PostgreSQL perspective.
ledgersmbdev.blogspot.com
ledgersmbdev.blogspot.com
It's a really nice method and has caught a lot of errors in the data those jobs are slurping up before they've impacted production.
It also allows you to do very complex type checking that you wouldn't be able to do in the native type systems of most languages (e.g. with MooseX::Types::Structured), like checking not only whether something is a hash, but it can only have these keys, and each of those keys have to match some constraint.
Obviously you can write custom code to do all that, but offloading it to the type system is so much nicer, and makes it trivial to share those checks between different modules.
It also makes it easy to selectively disable checks, e.g. if you have a large blob of data you're inserting into permanent storage in a cronjob you might like to to extensive validation of it, but you might not want to incur that validation cost on every retrieval in the system that consumes that data.
Different Perl libraries have chosen to use different ones. So in a large Perl project that uses a bunch of standard libraries you can easily wind up pulling in all three. Thus the common desire to produce something lightweight and fast has created bloat and slowness.
We are running on PostgreSQL which removes most of the options for $3/month hosting anyway.
But we already have dependencies that require Moose and therefore there isn't much point in avoiding it.
To load Moose on a vanilla perl only takes a couple of minutes and only uses 22 other modules: http://news.ycombinator.com/item?id=4042637