Re: Calling class methods from a metaclass
[email protected] (Todd Hepler)
| Newsgroups | perl.moose |
|---|---|
| Message-ID | <[email protected]> |
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