перегрузите объект moose с помощью объекта sub moose, чтобы он был просто обычной структурой типа данных


Я пытаюсь получить объект moose, который имеет объекты moose, на которые можно ссылаться как на вложенный набор простых типов данных perl, которые я могу называть hashref. например

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 2

1 ответ:

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