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

Reply via email to