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