On Wed, May 19, 2010 at 9:15 PM, Kate Yoak <[email protected]> wrote:
>>
>> after has_a => sub {
>> my ($class, $method_name) = (shift, shift);
>>
>> my $method = Moose::Meta::Method->wrap(
>> associated_metaclass => $class->meta,
>> package_name => $class,
>> name => $method_name,
>> body => $class->meta->get_all_package_symbols('CODE')->{$method_name},
>> );
>>
>> $class->meta->add_method($method_name => $method);
>> };
>>
>
> OK, that's neat. Perhaps even neater than the Sub::Name suggestion. I'll
> add it to my list to investigate. This problem actually screams for a
> MooseX::ImportGlobs kind of a module. It feels like one ought to be able to
> dig around, find all the unnamed globs and import them into meta with a
> single line of code.
I've refactored MooseX::MarkAsMethods a bit, to provide
mark_as_method() via the metaclass. It'll handle the messy parts of
marking something as a method (in a fashion hopefully close to
correct); e.g.
__PACKAGE__->meta->mark_as_method('foo');
Note the only bits MX::MAM automatically tries to mark as methods are
overloads. We don't tinker with the method heuristic aside from this.
In writing (a very few intial) tests for this, I found that CMOP/Moose
pick up on what's a method and what's not in all but a few situations:
* the method is an overload; or
* the method was added via typeglob assignment after class composition
has completed.
That's not a comprehensive list :)
I'd be very careful about actually using mark_as_methods(), however:
if something is not being picked up as a method, chances are very
likely that there's a good reason for it.
-Chris
--
Chris Weyl
Ex astris, scientia