Disclaimer: the name is a "working title". You don't even have to buy
the naming rights to change it.
# from Ken Williams
# on Monday 23 October 2006 07:35 pm:
>I'd like to pick up this thread again if possible. Splitting out a
>set of developer's tools from the installer's tools is something I'd
>really like to see happen.
Sorry that my "tomorrow" was so terribly delayed. I haven't gotten an
implementation yet, but I have thought about how to make things work in
an installer environment.
use inc::builder;
# maybe some options or something here
my $build_class = builder('Module::Hack');
my $builder = $build_class->new(...);
$builder->create_build_script;
in inc/builder.pm
# this code is autogenerated by Module::Hack
sub builder {
my ($package) = @_;
eval("require $package") or return('Module::Build');
return($package);
}
That's basically it for install-side implementation. The autogenerated
code would be created with `./Build incbuilder` just like manifest and
etc.
The basic ideas have been written down at this point at:
http://scratchcomputing.com/svn/Module-Hack/trunk/
(see lib/Module/Hack.pm and lib/Module/Hack/Manifesto.pod)
There's still a few issues to work out.
1. Making sure that your code builds in the absence of Module::Hack. I
think that any problems here are the developer's own fault. We'll talk
about install-side plugins later. If you're overriding ACTION_install
and can't add a build_requires entry, I can't help you there.
2. We lose the democratization of "the installer is the development
tool." I'm not sure this is a huge deal. Once you get over the hump
of installing M::B, installing M::H is easy on any modern perl. We
might need to add 'dev_requires' to META.yml, but I can think of at
least a few projects where this would be useful.
3. One might want to mix-n-match features from various M::B plugins. I
don't currently have a plan for compactly expressing this, but maybe
traits would do the trick. Most people trying to do `./Build dist` can
decipher an error message well enough to understand that they should
`cpan foo` to make it work, so maybe $self->want('foo') at runtime in
ACTION_blah is good enough for syntactic sugar and/or helpful errors.
I'm thinking the current dev features should be left in M::B as-is for
now, possibly making noise about deprecation if M::H needs to become
incompatible in some way.
Maybe builder() would be a simple dispatcher
# this code is autogenerated by Module::Hack v0.0.2
sub builder {
my $package = shift;
eval("require $package") or return('Module::Build');
# yeah, $package->VERSION >= $foo, etc would be a good idea
$package->import(@_);
return($package);
}
So, if you have directives for bring in traits...
my $build_class = builder('Module::Hack', traits => ['MatchMyPod']);
...
Then I guess what you get back is not Module::Hack, but an autogenerated
"Module::Hack::0x814ec28" (having methods from the MatchMyPod trait
flattened into it.) That might be over-engineered unless somebody
needs two unique trait collections where traits are incompatible, but
it's not that difficult to create Module::Hack::1, Module::Hack::2,
Module::Hack::3 packages keyed to caller() by a class hash. Note: you
can still subclass it.
As for installer-side plugins, what's wrong with build_requires =>
{Module::Hack => 0.1, Module::Build::Plugin::Foo => 0, ...} ? Yeah, we
might run into compatibility issues with new-fangled features and
dependencies, so maybe Module::Build::Plugins plus Module::Hack would
be in order (one providing the install-side compatibility and being in
build_requires, the other using Moose and such crazy stuff and being in
dev_requires.)
Credit (or blame) where due:
Michael Schwern played devils advocate on many items and brought up the
issue of istaller-side plugins, reminded me of the great equalizer,
etc. David Wheeler suggested that Module::Build::Plugins would be a
much better name.
That's about all I've got at the moment. Deadlines are currently
rushing past at an alarming rate.
Thanks,
Eric
--
"It is a mistake to allow any mechanical object to realize that you are
in a hurry."
--Ralph's Observation
---------------------------------------------------
http://scratchcomputing.com
---------------------------------------------------