Перегрузить объект Moose с помощью объекта Sub Moose, чтобы он представлял собой обычную структуру типа данных. - PullRequest
2 голосов
/ 23 января 2012

Я пытаюсь получить объект Moose, который имеет ссылки на объекты Moose как просто вложенный набор простых типов данных Perl, которые я могу назвать хэш-ссылкой. например,

my $ref = { %{ $obj } }

и структура может выглядеть как

{
  name => "bob",
  phones => [
    {
      phone_number => "15555554698"
    },
  ]
}

вместо

bless( {
  name => "bob",
  phones => [
    bless( {
      phone_number => "15555554698"
    }, 'PhoneNumber' )
  ]
}, 'User' )

вот моя попытка

use overload '%{}' => '_hashref';

sub _hashref {
    my $self = shift;

    foreach my $attr ( $self->meta->get_all_attributes ) {
        if ( $attr->has_read_method ) {
            say $attr->name;
            say $attr->get_value( $self );

        }
    }
    return {};
}

к сожалению, get_value, кажется, делает что-то рекурсивное и работает до тех пор, пока не выйдет из строя. Я попытался передать его __PACKAGE__ и просто 'User', но ни один из них не помог. Кто-нибудь есть какие-либо предложения о том, как я могу получить атрибуты и значения, чтобы я мог работать с ними? или другой умный способ сделать это? примечание: я знаю, что в настоящее время я возвращаю пустой хэш-код, на данный момент просто пытаюсь выяснить, как я могу получить значения

1 Ответ

5 голосов
/ 23 января 2012

"Рекурсивная" вещь, которую get_value делает, пытается получить доступ к
$self->{$slot_name}, который вызывает вашу перегрузку %{}, которая вызывает get_value ... Вы можете обойти эту проблему, временно победив перегрузку (в документации по перегрузке есть пример , или вы может перестать пытаться переопределить то, что MooseX :: Storage уже делает довольно хорошо.

...