Wanted to get some feedback on an idea that I'm toying with here on a project
I'm working on....
With MB, having to subclass in order to add-in new features to the build works
great, except that it doesn't let me split out those features into something
that I can easily re-use from one project to the next. Yes, I could just
spin out a package that gathers up -everything- I'm doing, but there are
times that I'd really just like to cherry-pick through the features I need
for the project and include only those that are necessary.
So... I've been toying with the idea of "Module::Build::Pluggable" (MBP),
which would be a hook/callback framework built on top of Module::Build.
You'd subclass from MBP and then just include in the plug-ins that you wanted
to have mix-in to your build environment.
Plug-ins wouldn't replace the existing MB behaviour/actions, but would
supplement it. When loaded, plug-ins would be able to register themselves
with MBP and tell it which action they want to run in (and whether
that's "pre:" or "post:" the core MB action).
A chunk of code is probably worth a thousand words...
# First, create your custom build class
package MY::Build;
# derive from MBP
use base qw( Module::Build::Pluggable );
# then, load up MBP plug-ins
use Module::Build::Plugin::example;
use Module::Build::Plugin::...
use Module::Build::Plugin::...
# Then, use that class in your Build.PL
use MY::Build;
MY::Build->new(
# regular Module::Build parameters
)->create_build_script();
# Plug-ins would register themselves with MBP when loaded
package Module::Build::Plugin::example;
sub import {
my $caller = scalar(caller);
$caller->add_callback( 'ACTION_test', \&test );
}
sub test {
my $self = shift;
# your extra "test" stuff goes here
}
Having this type of pluggable interface would make it easier to extend MB with
new actions as you could mix them as needed, without having to try to deal
with wonderful things like multiple inheritance. OR, have I completely
missed the boat and overlooked some feature of MB that'd let me easily split
build features out into separate modules and mix them in as needed?
--
Graham TerMarsch
Howling Frog Internet Development, Inc.