On Wednesday 28 Apr 2010 08:04:31 Daniel Pittman wrote: > Shlomi Fish <shlo...@iglu.org.il> writes: > > On Tuesday 27 Apr 2010 15:51:07 Stevan Little wrote: > >> On Apr 27, 2010, at 3:36 AM, Shlomi Fish wrote: > >> > After merging XML-Grammar-Fiction and XML-Grammar-Screenplay, I have > >> > accumulated several questions about Moose, so I'd post each one in a > >> > separate post to keep each thread single-topic. (I hope it's OK.) > >> > > >> > The first one is how to implement a Class::Std/Perl 6-like walkmeth: > >> > > >> > * > >> > http://blog.gmane.org/gmane.comp.lang.perl.qotw.discuss/month=2007070 > >> > 1 > >> > > >> > * http://search.cpan.org/perldoc?Class::Std (search for CUMULATIVE). > > > > [SNIP] > > > >> > My question is: is there a better way to do it using Moose? (Or one of > >> > the MooseX modules?) Instead, should I implement my own private logic > >> > or create a new MooseX module? > >> > >> No, that is pretty much how you would do it. Take a look at > >> Moose::Object::BUILDALL, it does the same thing. > > > > OK, thanks. I might create a small MooseX::AccumArray distro out of it. > > If you do get around to looking at this, I have a couple of times played > with the idea of either hacking on Class::MOP[1], or writing an extension, > to do some more of the method combination bits that CLOS used to do. > > Specifically, I have run across the need for: > > 'and' and 'or' method combination[2], both with most-specific-first and > least-specific-first ordering — various validations like ACL-style > authorisation, and data validation, benefit from those. > > The "accumulate to array" method combination you mention is also quite > useful, but a bit obvious right now. > > > CLOS also had min, max, and plus method combinations, for which I can see > some logic exposing in Moose also — and probably some of the "...write > your own" too.
OK, now we're talking about generalising the walkmeth functionality of what I need. I didn't get so far into studying CLOS (I studied CL mostly from the book "Practical Common Lisp"), or forgot it, but I think I know what you mean. Everything you describe is a sub-case of "reduce" like the one in List::Util, although the concept predates List::Util and Perl itself by a long time: http://search.cpan.org/perldoc?List::Util Now, the problem with such a reduce is that it has to know to short-circuit in case it's a cumulative (and...) or (or...) operation. And then we need to decide whether we code one distinct accumulating meta-method for every such operation (as accum_array, accum_and, accum_or, accum_min, accum_max, accum_sum, etc.) or that we implement a generic reduce and then implement each specific accumulator based on it (which may result in slower code.). And naturally I now remember that "perfect is the enemy of good", and that there's a saying in Hebrew that "caught a lot - did not catch anything.". Oh! Decisions, decisions. Regards, Shlomi Fish > Daniel > > > Footnotes: > [1] This embeds the "standard" method combination inside > Class::MOP::Method::Wrapped as a private method internally; it doesn't > look terribly hard to extend to either use external method combination > classes, or to support non-standard (eg: not before, after, around) > decorators ... which makes me think I have missed something in my > look-but-not-touch investigation so far. > > [2] I suspect that Perl users would like a "and-true" and "and-defined" > variant of both of these, that short-circuit when the value is false > and undefined respectively, where CLOS users didn't. -- ----------------------------------------------------------------- Shlomi Fish http://www.shlomifish.org/ http://www.shlomifish.org/humour/ways_to_do_it.html God considered inflicting XSLT as the tenth plague of Egypt, but then decided against it because he thought it would be too evil. Please reply to list if it's a mailing list post - http://shlom.in/reply .