Blog-Agnostic Widgets

October 10th, 2010
PerlCatalystMasonBlogWidgetsWWW::Widgets

Blog-Agnostic Widgets

Please, someone stop me if this has already been done elsewhere…

While I was raking the leaves yesterday, I was entertaining thoughts about new widgets for Galuga. From there, I began to think that while there’s a thousand and one different blog engines out there, it’s kinda silly that, for each of them, we re-write almost-identical HTML and Javascript for the different widgets and badges we adorn them with. Wouldn’t be be nice if there was a standard way to write those widgets so that we they could be used and shared across all Perl blog engines?

Cue in WWW::Widget, probably the most trivial API ever designed. Written as a Moose Role, it requires from wannabe-widget classes only two things: that they pass all configuration elements at object-creation time, and implement a as_html() method.

And that’s pretty much it. The role auto-wraps the HTML generated by as_html() in a div with two classes, WWW-Widget and WWW-Widget-ThisWidgetClass so that the display can be controlled via CSS. And, for the laziness-inclined, the role also overloads the object’s stringification to be an alias to as_html().

Bottom-line, in Galuga (which uses Catalyst and Mason), I can now take care of my widgets by having the following in my configuration:

<widgets>
    <PerlIronMan>
        id yanick
    </PerlIronMan>
    <Twitter>
        username yenzie
    </Twitter>
</widgets>

and put this stanza in my template:

% while ( my ( $widget, $conf ) = each %{ $c->config->{widgets} } ) {
%   my $package = 'WWW::Widget::'.$widget;
%   eval "use $package; 1" or next;
%   $conf ||= {};  # in case there's no configuration item
    <% $package->new( %$conf ) %>
% }

The module is not yet available on CPAN, but should be soon (as soon as I distributionify the code, slap a little bit of documentation on it, and make sure I’m not reinventing an already existing wheel).