At least on the operating systems I care about this seems to work fine. The functionality is limited (I wish it'd give me mac addresses, too), but compared to some of the alternatives the API at least isn't insane.
General advice: Use the DateTime modules, or almost anything else than Time::Local if DateTime doesn't suit you.
For general "handle dates" purposes Time::Local is a terrible choice. Even for parsing dates, it's unlikely to be the right choice ("Date::Parse" builds on it though).
However - for doing "the reverse of local time and gmtime" this module is the best. It's fast and the API is simple if you have a parsed date that you just need a unix timestamp for.
Tonight I had 200 million of those and on the system that had the data that'd take 16 hours to parse with DateTime::Format::RFC3339, 3 hours with Date::Parse and 45 minutes with split and Time::Local.
If you need to authenticate users via their twitter account in your Dancer app, this module makes it super simple.
After the user is authenticated, you get access to the full Net::Twitter object for full "twitter integration".
This module is a Perl interface for the Braintree Payments service.
As another reviewer noted, there's no documentation in the package itself. It is, however, reasonably well documented on the vendors website (the module is useless without their website anyway): www.braintreepayments.com/docs/perl -- at least a pointer to that would be nice to have inline.
The API is nicely "Perl-ified" while still following their general API conventions (so the "base documentation" and examples in other languages are useful, too).
There are - unsurprisingly - a bunch of modules on CPAN to generate passwords.
For sites with moderate needs for "super random" passwords, this module makes reasonable passwords for regular users. It doesn't make "super random" passwords, but I suspect Text::Password::Pronounceable will generate passwords that the users are less likely to change into something completely stupid than if you create default passwords like j^ß*r5æé#.
The API is appropriately simple and easy to use.
I have a project where I needed to implement Apache-style routing from an httpd.conf file. Of the various "routing" modules Router::Simple was the easiest to map to this particular problem â€“ and so far it's been more than flexible enough.
The other similar modules (listed in the Router::Simple documentation) have other features, but Router::Simple was by far the easiest to get started with and to understand/debug as I was getting my application workingÂ®.
Perlbal is great as a backend tool to load balance busy application servers. For static content and such, other options (Varnish, nginx, haproxy for example) are better Ã¢Â€Â“ but for careful, accurate and end-to-end reliable load balancing of resource intensive servers perlbal is great.
Some of my favorite unique perlbal features are
- Checks each connection is actually working before using it (optional, but the default)
- Can multiplex keep-alive connections so the client and servers are both keep-alive, but not tied to each-other.
How hard can it be to round a number? Well, surprisingly tricky. Sure, it's still just a few lines - but with this module it's taken care of for you in a reasonable fashion. The API is quite complete with various "rounding related" functions. (Floor, ceiling, round to nearest multiple of a number etc).
Just use Sys::Hostname -- it does the same thing and it's maintained. :-)
This is mostly regarding Mail::Send/Mail::Mailer. As Jos mentioned, it's just full of inconsistencies, the API is awful and under-documented and the default behavior is weird at best and harmful at worst.
It might have been a good idea back in the day when everyone were running all programs as their own user on the system where they also read email; but it's 10 years later now and we should use something better (the APIs etc here are just too convoluted and awful to fix).
It seems to work ok for basic numeric size based file rotation, but the date stuff is a mess. Using Date::Manip (which now requires 5.10); the 'yyyy-mm-dd' format is a hack (only specific formats work; and they aren't documented). .... and I couldn't actually get it to work.
I only just started looking at the code when I found Log::Dispatch::File::Stamped which is much simpler, clean code and does what I needed.
Yes, you need to read the MongoDB documentation to use this - but that's like having to learn a bit of SQL to use DBD::mysql.
The API is very similar to the APIs in other languages but yet very "Perl-ish". It uses Moose, so it brings a good foundation to build your own abstractions on top.
SVN::Notify is easy to setup and sends beautiful commit messages.
We recently converted a project to git and we miss a tool this good.
From the code examples it looks like there might be a unique approach in this module (compared to Template Toolkit, Mason, HTML::Template, ...), but since the documentation is all French and my French isn't that great, I couldn't get started!
You install the bundle from the CPAN.pm shell (run it with "perl -MCPAN -eshell" or on most systems just as "cpan"). Do an "install Bundle::W3C::Validator" from the CPAN shell and it'll install all the modules needed.
An earlier reviewer was disappointed that this package didn't actually include the other modules, but that's not how the CPAN bundles work (or should work).
From spread.org: "Spread is a toolkit that provides a high performance messaging service that is resilient to faults across external or internal networks. Spread functions as a unified message bus for distributed applications, and provides highly tuned application-level multicast and group communication support."
The Spread.pm module doesn't have a very Perl'ish API. Spread::Session is a thin OO wrapper that makes the API very neat and clean.
You still have to install Spread.pm - and not from CPAN. You need to use the distribution that is included with the spread code to make it compile.
It would be helpful if the documentation had a few hints as to how to control the logging Spread::Session does (via Log::Channel); or maybe there could even be an option in the constructor to turn it off.
DBI.pm is an amazingly useful module; but you probably already use it and know that.
(how's this for a test review?)