Вы можете сбросить кодовую ссылку с помощью Data :: Dumper после установки $Data::Dumper::Deparse
в истинное значение, но это предназначено только для целей отладки, а не для сериализации.
Я бы посоветовал вам вернуться к рассмотрению того, почему MooseX :: Storage не работает для вас, так как авторы действительно изо всех сил пытались представить хорошо абстрактное и надежное решение для сериализации объектов Moose.
Обновление: похоже, вы столкнулись с проблемами при сериализации атрибута _offset_sub
, как описано в этот вопрос . Поскольку у этого атрибута есть построитель, а его конструкция довольно тривиальна (он просто смотрит на текущее значение другого атрибута), вам вообще не нужно его сериализовывать - когда вы десериализуете свой объект и хотите использовать его снова, строитель будет вызван при первом вызове $this->offset
. Следовательно, вы должны просто пометить его как «не сериализовать»:
use MooseX::Storage;
has '_offset_sub' => (
is => 'ro',
isa => 'CodeRef',
traits => [ 'DoNotSerialize' ],
lazy => 1,
builder => '_build_offset_sub',
init_arg => undef,
);
Наконец, это несколько ортогонально, но вы можете сложить offset
и
_offset_sub
атрибуты вместе с помощью нативного атрибута «Код»:
has offset => (
is => 'bare',
isa => 'CodeRef',
traits => [ qw(Code DoNotSerialize) ],
lazy => 1,
builder => '_build_offset',
init_arg => undef,
handles => {
offset => 'execute_method',
},
);
sub _build_offset {
my ($self) = @_;
# same as previous _build_offset_sub...
}