我知道,虽然Moose对象的内部表示(理所当然)是未定义的。然而,在几乎所有的情况下,它都将是一个基本的有福的hashref。在创建新对象时,如果遗留代码希望通过从受祝福的散列($object->{attribute})中获取对象属性来访问对象属性,而不是通过方法调用($object->attribute())将其封装到对象中,那么是否有办法显式地定义该对象需要存储为受祝福的hashref,以便属性正常工作?
更好的是,有没有什么模块可以将被祝福的对象从对象内部表示中解耦出来呢?似乎可以传递一个绑定的散列,该散列可以将集合定义的散列键绑定到针对实例化的元对象的方法调用中,因此即使一些旧代码将对象调用为$object->{attribute} = 'blahblah',所有的类型检查仍然可以完成。
发布于 2011-09-17 10:15:21
BEGIN {
package MyMyMy;
use Moose;
has "watusi" =>
is => "rw",
isa => "Str";
}
my $mymymy = MyMyMy->new( watusi => "batusi" );
print $mymymy->watusi, $/;
$mymymy->watusi("woo-woo");
print $mymymy->{watusi}, $/;
$mymymy->{watusi} = "BAD DEV, BAD!";
print $mymymy->watusi, $/;
__END__
batusi
woo-woo
BAD DEV, BAD!我猜你已经知道这是怎么回事了。我发现很难想象Moose会以一种阻止它工作的方式改变内部结构。因此,尽管您试图做到这一点,但如果您的真正目标只是将一些遗留代码从转储中提取出来,我会说您可以依靠这一点,前提是您有一个真正的计划,可以继续前进,迁移到更现代的实践,并防止接口冲突。
https://stackoverflow.com/questions/7450434
复制相似问题