On Fri, Jun 13, 2008 at 12:10 PM, Todd Hepler <[EMAIL PROTECTED]> wrote:
> Dan Harbin wrote:
>>
>> The following:
>>
>>    #!/usr/bin/env perl
>>    use strict;
>>    use warnings;
>>
>>    package MyClass;
>>    {
>>      use Moose;
>>
>>      sub hello_class {
>>        my $class = shift;
>>        return  "Hello $class\n";
>>      }
>>    }
>>
>>    print "1: ", MyClass->hello_class(), "\n";
>>
>>    my $myclass = Class::MOP::get_metaclass_by_name('MyClass');
>>
>>    print "2: ", $myclass->hello_class(), "\n";
>>
>
> For your example, this should work:
>
>      print "2: ", $myclass->name->hello_class(), "\n";
>
>
>
> I guess there are kinda 2 ways to think of class methods in Moose.  You can
> do it like your example above, or you could use an object method on the
> metaclass object -- which is what $myclass->hello_class() is trying to call.
>  Perhaps a unifying approach would look like:
>
> {
>
>    package MyMetaClass;
>
>    use Moose;
>    BEGIN { extends 'Moose::Meta::Class'; }
>
>    sub hello_class {
>        my $self = shift;
>        return "Hello " . $self->name . "\n";
>    }
> }
>
> {
>
>    package MyClass;
>    use metaclass 'MyMetaClass';
>    use Moose;
>
>    sub hello_class {
>        my $class = shift;
>
>        # delegate to the metaclass
>        return $class->meta->hello_class;
>    }
> }
>
> print "1: ", MyClass->hello_class(), "\n";
> my $myclass = Class::MOP::get_metaclass_by_name('MyClass');
> print "2: ", $myclass->hello_class(), "\n";
> print "3: ", $myclass->name->hello_class(), "\n";
>
> But that does seems a bit... un-concise.
>
> -Todd
>
>

Thanks Todd, that worked (the first way - I didn't try the second).

Reply via email to