2014-02-06 6 views
3

Я пытаюсь выполнить итерацию по атрибутам объекта Moose, распечатав значение атрибутов без привлечения каких-либо ленивых сборщиков (хотя и печать, если значение атрибута существует).Атрибут Moose существует

Моего код до сих пор выглядит следующим образом:

for my $attr ($object->meta->get_all_attributes) { 
    my $name = $attr->name; 

    # Lazy attributes that have not already been generated will not 
    # exist in the object hash. 
    next unless exists $object->{$name} 

    my $value = $object->$name; 
    print $value; 
} 

Есть ли способ проверки объекта с использованием Лося, который скажет мне, если значение атрибута существует, не изменяя сам класс лосей?

т.е. более элегантная альтернатива «рядом, если не существует» строка в коде выше

Спасибо за любую помощь и внимание :)

ответ

3

Читая Moose::Meta::Class документации укажут вам Class::MOP::Class и Class::MOP::Attribute.

Вы можете написать код что-то вроде этого:

foreach my $attr ($object->meta->get_all_attributes) { 
    my $name = $attr->name; 

    next unless $attr->has_value($object); 

    # Or, perhaps get_value(), depending on your requirements. 
    say $attr->get_raw_value($object); 
}