Blog-Agnostic 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).