使用Moose在客户期望访问$ object-> {private_variable}数据的多态情况下对对象进行编码

时间:2011-09-16 21:11:22

标签: perl object encapsulation moose

我知道,虽然Moose对象的内部表示(正确地)未定义。但是,几乎在所有情况下,它都将是一个基本的祝福hashref。在创建新对象的情况下,可以通过遗留代码调用该对象,该遗留代码期望通过从有福散列($object->{attribute})中获取对象属性来访问对象属性,而不是通过方法调用封装到对象中( $object->attribute()),有没有办法明确定义对象需要存储为祝福的hashref才能使属性正常工作?

更好的是,那里有没有任何模块可以解耦从对象内部表示传递的受祝福对象?看起来有可能传递一个绑定的哈希,可以将设置定义的哈希键绑定到针对实例化的元对象的方法调用,这样即使一些旧代码将对象调用为$object->{attribute} = 'blahblah',所有类型检查仍然完成

1 个答案:

答案 0 :(得分:1)

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会以一种阻止其工作的方式改变内部结构。所以,正如你想要的那样正确,如果你真正的目的只是为了从转储中获取一些遗留代码,我会说你可以依赖这个,只要有一个真正的计划继续前进并迁移到更多现代做法并防止界面违规。