带有子驼鹿对象的过载驼鹿对象只是常规的数据类型结构

xen*_*ide 2 perl operator-overloading moose

我正在尝试获取一个moose对象,它将moose对象作为一组嵌套的普通perl数据类型引用,我可以将其称为hashref.例如

my $ref = { %{ $obj } }
Run Code Online (Sandbox Code Playgroud)

结构可能就像

{
  name => "bob",
  phones => [
    {
      phone_number => "15555554698"
    },
  ]
}
Run Code Online (Sandbox Code Playgroud)

代替

bless( {
  name => "bob",
  phones => [
    bless( {
      phone_number => "15555554698"
    }, 'PhoneNumber' )
  ]
}, 'User' )
Run Code Online (Sandbox Code Playgroud)

这是我的尝试

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 {};
}
Run Code Online (Sandbox Code Playgroud)

不幸的get_value是,似乎做了一些递归的事情,直到它发生了段错误.我试过传递它__PACKAGE__,'User'但似乎都没有工作.有没有人对我如何获得属性和值有任何建议,以便我可以对它们进行操作?还是另一种更聪明的方法呢?注意:我知道我现在正在返回一个空的hashref,此时只是想弄清楚我如何得到这些值

hob*_*bbs 5

get_value正在进行的"递归"操作是尝试访问
$self->{$slot_name},这是调用你的%{}重载,这是调用get_value...你可以通过暂时击败重载来解决这个问题(在重载文档中有一个例子),或者你可以停止尝试重新实现MooseX :: Storage已经做得很好.