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