2011-06-03 7 views
7

Utilizando __PACKAGE__->meta->get_attribute('foo'), puede acceder a las definiciones de los atributos foo en una clase determinada, que pueden ser útiles.Moose (Perl): acceso a las definiciones de atributos en las clases base

#!perl 
package Bla; 
use Moose; 
has bla => is => 'ro', isa => 'Str'; 
has hui => is => 'ro', isa => 'Str', required => 1; 
no Moose; __PACKAGE__->meta->make_immutable; 

package Blub; 
use Moose; 
has bla => is => 'ro', isa => 'Str'; 
has hui => is => 'ro', isa => 'Str', required => 0; 
no Moose; __PACKAGE__->meta->make_immutable; 

package Blubbel; 
use Moose; 
extends 'Blub'; 
no Moose; __PACKAGE__->meta->make_immutable; 

package main; 
use Test::More; 
use Test::Exception; 

my $attr = Bla->meta->get_attribute('hui'); 
is $attr->is_required, 1; 

$attr = Blub->meta->get_attribute('hui'); 
is $attr->is_required, 0; 

$attr = Blubbel->meta->get_attribute('hui'); 
is $attr, undef; 
throws_ok { $attr->is_required } 
    qr/Can't call method "is_required" on an undefined value/; 
diag 'Attribute aus Basisklassen werden hier nicht gefunden.'; 

done_testing; 

Como se desprende de este pequeño ejemplo de código, sin embargo, esto no puede ser utilizado para acceder definiciones de atributos en las clases de base, lo que sería aún más útil para mi caso particular. ¿Hay alguna manera de lograr lo que quiero?

Respuesta

9

NOTA de que get_attribute no busca superclases, para eso se necesita utilizar find_attribute_by_name

- Class::MOP::Class docs. Y, de hecho, este código pasa:

my $attr = Bla->meta->find_attribute_by_name('hui'); 
is $attr->is_required, 1; 

$attr = Blub->meta->find_attribute_by_name('hui'); 
is $attr->is_required, 0; 

$attr = Blubbel->meta->find_attribute_by_name('hui'); 
is $attr->is_required, 0; 
+0

Funciona, fantástico, gracias! :-) – Lumi

Cuestiones relacionadas