I'm happy to announce the release of the latest version of the Perl MongoDB driver. This version has a number of significant changes, including the new MongoClient top-level API. This change unifies the API nomenclature among most of MongoDB's officially supported driver libraries. It is also now the default behavior for MongoDB drivers to issue a write concern of 1 on all requests.
Conference registration is a mere $100 ($30 for students). There are three tracks, covering everything from beginner topics presented by 10gen staff to advanced, detailed MongoDB presentations by industry leaders. Here's the abstract for my talk:
This talk introduces the features of MongoDB by demonstrating how one can build a simple library application. The talk will cover the basics of MongoDB's document model, query language, and API. In addition, we will learn how to use MongoDB within a typical web application framework.
If you're in Boston and you've never used MongoDB before, or are thinking of trying it out, I'd highly recommend stopping by. The demo application for the talk is written with Mojolicious::Lite and will soon be available on GitHub for you to experiment with.
Starting with MongoDB.pm 0.46.3, MongoDB is no longer supported on Perl 5.8 and below. (If you must use 5.8, you can still use old versions of the driver, but you won't get any cool new features.) The first release of Perl 5.8 turned ten years old in July, so the fact that more and more of CPAN lists Perl 5.10 (or even 5.12) as a dependency should come as no shock. The current release of Perl is 5.16.
One of my many rules of software engineering, born of more than a decade seeing things done the Wrong Way, is that serialization must occur only at the extreme edges of your program. At all other points you should, if possible, deal only with structured data. The lack of it in one crucial area of the Perl MongoDB driver is what made support for Perl 5.8 no longer possible.
BSON (binary JSON) is the data serialization format that MongoDB uses internally and over the network. It's a simple and expressive format which is easy to parse and efficient to store. When BSON documents are retrieved from the MongoDB store, they must be deserialized by the client-side driver code and inflated into the native structures of the programming language being used. Unfortunately, this has resulted in a great deal of code duplication, as each language driver has implemented its own BSON encoder and decoder, sometimes on multiple occasions.
One of the most common complaints about the Perl MongoDB driver is that it tries to be
a little too clever. In the current production release of MongoDB.pm (version 0.46.2 as of
this writing), all datetime values retrieved by a query are automatically instantiated
DateTime is a remarkable CPAN distribution. In fact, I would say that
DateTime and its related distributions on CPAN comprise one of the best
date and time manipulation libraries in any programming language. But that power comes with
a cost. The
DateTime codebase is large, and instantiating
objects is expensive. The constructor performs a great deal of validation, and creates a
large amouunt of metadata which is stored inside the object.
Upcoming changes to the Perl MongoDB driver solve this problem.
I'm happy to announce that after a long delay, version 0.46.1 of the Perl MongoDB driver has now been uploaded to CPAN, and should be available on your friendly local CPAN mirror soon.
This release is mostly a series of minor fixes and housekeeping, in preparation for developing a more detailed roadmap for more frequent releases down the line. Here's what's new so far:
After falling in love with
Pod::Weaver, I've released two new
Pod::Weaver plugins which you may find useful for assembling boilerplate POD sections in your distributions.
The first is
Pod::Weaver::Section::Extends which will add a
=head1 EXTENDS section with a list of everything in your
@ISA at compile-time. It should work with any kind of object that modifies
@ISA in a normal way.
The second is
Pod::Weaver::Section::Consumes, which does the same thing for Moose roles. It will interrogate any Moose-compatible
meta object for your class to find a list of roles.
I've been working on
Redis::Client for a while now. It's not ready for production use yet, and there's a lot of work yet to be done, but it's much better than anything else on CPAN right now for talking to Redis.
I hate boilerplate with a burning passion, and I will often go to extreme lengths to avoid typing it. (I typed it once already, dammit! Leave me alone!)
A question recently appeared on Stack Overflow about using
namespace::autoclean in conjunction with operator overloading.
It turns out that you can't, because namespace::autoclean, in addition to cleaning up symbols for imported subs, also cleans up the operator magic installed by overload.pm.
This had been noticed before, but the suggested fix was rejected in favor of implementing the logic to support overload methods in
Class::MOP, which namespace::autoclean uses under the hood to figure out the list of allowed methods for a class, and it doesn't look like anyone is interested in doing that right now.
As it happens, I'm working on a distribution right now which uses Moose and does some operator overloading, so namespace::autoclean would be a problem. I decided that there's really no reason a symbol-cleaning pragma should depend on Moose (or the MOP) so I wrote namespace::sweep as a replacement. More on the advantages and disadvantages below.
I've released a (very preliminary) development release of a new project, App::htrepl, a commandline REPL for more easily debugging HTTP applications. It was inspired by a similar project for Node.js, the link to which I can't find at the moment. You can find the repository at github here, and it will be hitting your local CPAN mirror soon.
REPL means read-eval-print loop. App::htrepl provides a commandline script,
htrepl, which makes it easier to talk to your HTTP applications. The only dependencies are LWP and Term::ReadLine; the code is otherwise designed to be as lean as possible.
Here are some examples of how it can be used: