カスタムの init_arg を使用して必要な属性を持つ Moose クラスにシリアライゼーションを追加しようとしています (API の一貫性のために属性名の前にダッシュを付ける)。これにより、アンパックが失敗するようです。私の要点を説明するために、以下のテストケースをセットアップしました。
use strict;
use warnings;
package MyClass1;
use Moose;
use MooseX::Storage;
use namespace::autoclean;
with Storage;
has 'my_attr' => (
is => 'ro',
isa => 'Str',
required => 1,
);
__PACKAGE__->meta->make_immutable;
package MyClass2;
use Moose;
use MooseX::Storage;
use namespace::autoclean;
with Storage;
has 'my_attr' => (
is => 'ro',
isa => 'Str',
required => 1,
init_arg => '-my_attr',
);
__PACKAGE__->meta->make_immutable;
package main;
my $inst1 = MyClass1->new(my_attr => 'The String');
my $packed1 = $inst1->pack;
my $unpacked1 = MyClass1->unpack($packed1); # this works
my $inst2 = MyClass2->new(-my_attr => 'The String');
my $packed2 = $inst2->pack;
my $unpacked2 = MyClass2->unpack($packed2); # this fails with a ...
# ... Attribute (my_attr) is required at ...
更新:さらに調査したところ、パッキング時に init_arg が考慮されていないことが問題であることがわかりました。したがって、カスタムの init_arg を使用する必須でない属性であっても、アンパック後に正しく復元されません。この追加のテスト ケースを参照してください。
package MyClass3;
with Storage;
has 'my_attr' => (
is => 'ro',
isa => 'Str',
init_arg => '-my_attr',
);
# in main...
my $inst3 = MyClass3->new(-my_attr => 'The String');
my $packed3 = $inst3->pack;
my $unpacked3 = MyClass3->unpack($packed3); # this seems to work ...
say $unpacked3->my_attr; # ... but my_attr stays undef
助けてくれてどうもありがとう、デニス