Hi! On Monday 04 August 2008, David E. Wheeler wrote: > On Aug 3, 2008, at 05:19, Shlomi Fish wrote: > > Hmmm... that's interesting. Sounds useful. Is it supported in > > search.cpan.org/kobesearch yet? Of course, I'd also like to have > > Freshmeat-like categories: > > > > http://freshmeat.net/browse/18/ > > You would need to get them into the META spec, I think. >
OK, sounds fair. > > Because "The only thing that can parse Perl is perl". It would be > > very hard to > > write a third-party program that will parse a typical Build.PL > > syntax and > > manipulate it along with all the possible edge-cases. For example, > > in some of > > my modules I have used a sub-class of Module::Build (which I called > > Test::Run::Builder) instead, so if I'm looking for Module::Build I > > won't find > > it. > > Um, nothing has to parse Build.PL. Parse and modify Build.PL > It generates META.yml, which can be > parsed. META.yml can be parsed, but if I modify it, then the modifications will be lost the next time I run Build.PL. > End of story. (Oh, and BTW, Adam Kennedy put the lie to "only > Perl can parse Perl" myth.) The problem is that even after I have a syntax tree in PPI, the programmer is capable of confusing the code enough so that knowing what exactly to modify will be hard. See, for example: http://en.wikipedia.org/wiki/Halting_problem > > > Similarly, I can name the Module::Build instance in any way I want > > which will > > further complicate things. Or I can put some of the parameters in > > variables, > > etc. > > I don't follow you here. > <<<< I can name the Module::Build instance in any way I want>>>> This means I can do: {{{{{{{{{ my $mb = Module::Build->new(....); }}}}}}}}} Or: {{{{{{{{ my $builder = Module::Build->new(....); }}}}}}}} Or: {{{{{{{ my $foobar = Module::Build->new(....); }}}}}}} Etc. <<<I can put some of the parameters in variables>>> {{{{{{{{{{{ my @keywords = (qw(moose mouse oop omgponies)); . . . my $mb = Module::Build->new( meta_add => { keywords => [EMAIL PROTECTED], }, ); }}}}}}}}}}} Now where do we need to change it? > > Yes, but if I over-ride the paramaters in META.yml, then it will be > > over-written once I re-run Build.PL. META.yml is entirely at the > > mercy of > > Build.PL and should not be edited by hand. > > Correct. > So you agree that I should not edit META.yml directly? In this case I want something machine-readable as input to M::B, which will eventually end up at META.yml where the CPAN interfaces can find it. > > I want to allow a program or a human to give parameters to Build.PL > > so they'll > > eventually be preserved there. > > You can pass parameters to Build.PL quite easily: via the command-line. > Ah. But if I want to make it machine-readable, then I'll need a YAML (or whatever) file which will in turn be read by Meta-Build.PL which will run Build.PL with all of these command line args. This will add more complexity, and will be probelamtic if someone runs Build.PL directly. > > No, it's not. Build.PL places some other parameters into META.yml, > > like the > > individiuals .pm files and their versions, etc. We need a way to > > input it > > paraemeters in a way that's not hard-coded in the Build.PL Perl code. > > Why? > Because I want to > >> I find Perl easier to type than YAML. YAML is much more error-prone, > >> IMO. > > > > Yes, but computer programs can more easily read and write YAML. > > Hence META.yml. > META.yml is intended for reading and is the exclusive domain of Build.PL to output. One cannot manipulate it directly and expect it to be preserved after running Build.PL again. > > Well, I'm not proposing that we completely do away with Build.PL or > > even with > > the parameters given to the Module::Build constructor. I'm just > > saying that > > we should give a way for programs to give it arguments as well, > > without > > having to parse the Perl and try to make sense of it. > > Yep, that's what the command-line arguments are for. > Ah. But I need to remember to append them to Build.PL everytime. If it's written in a file somewhere under the local directory it would be less error-prone. > > So we have the machine+human-manipulatable input and the data and > > code in the > > Build.PL as input to Module::Build. > > I'm pretty sure you can already do what you want via command-line > arguments. If some are not properly passed through, well then you can > patch that, that seems reasonable to me. And I could see a case for a > Module::Build::Config or something that uses a configuration file to > call Build.PL and pass it parameters (See SVN::Notify::Config for an > example of a third-party module that uses YAML to replace command-line > options to another program). It's entirely possible I'm missing your > point, but it sure seems like you can pretty much already do what you > want to do, without requiring any new features in Module::Build. See above. > > But a patch demonstrating what you want would probably be more > convincing, in that we could much better understand what it is you want. > I think I can accomplish that using a sub-class, so that will be my first lead. I'll also do it TDD-style, so you can understand what I mean using the tests. Regards, Shlomi Fish ----------------------------------------------------------------- Shlomi Fish http://www.shlomifish.org/ Why I Love Perl - http://xrl.us/bjn88 I met a guy in the bar, talked to her and she gave me her phone number.