在Moose擴展中,我在寫我試圖從屬性內訪問屬性值,而不通過訪問器,但我似乎無法得到正確的結果。從屬性中獲取屬性值
我想能寫這樣的代碼
{
package Test;
use Moose;
use MooseX::RemoteName; #provides magic
has attr0 => (
isa => 'Bool',
is => 'ro',
default => sub { 1 },
serializer => sub {
my $s = shift;
return $s->get_value($s) ? 'Y' : 'N';
},
);
has attr1 => (
isa => 'Str',
is => 'ro',
)
}
,這樣我就可以做(從我的測試)
my $t0 = Test->new({ attr1 => 'foo' });
isa_ok my $attr0 = $t0->meta->get_attribute('attr0'), 'Class::MOP::Attribute';
is $attr0->serialized, 'Y', 'remote_name serializes';
isa_ok my $attr1 = $t0->meta->get_attribute('attr1'), 'Class::MOP::Attribute';
is $attr1->serialized, 'foo', 'remote_name serializes'; # undef
這就是我想要的擴展
has serializer => (
isa => 'CodeRef',
is => 'ro',
lazy => 1,
default => sub {
return sub {
my $arg = shift;
return $arg->get_value($arg->associated_class);
}
},
);
sub serialized {
my $self = shift;
my $coderef = $self->serializer;
return &$coderef($self);
}
我認爲串行器可以調用訪問器。沒有訪問者調用我可以看到的序列化程序的危險。 – Schwern 2012-04-13 02:50:48
唯一的問題,我與那是在某些情況下,我將取消定義讀者... – xenoterracide 2012-04-13 03:22:08