2011-09-16 1 views
2

Mooseオブジェクトの内部表現が(正当な)未定義のままであることがわかります。しかし、ほとんどの場合、基本的な祝福されたハッシュリファレンスになるでしょう。メソッドコール($object->attribute())によってオブジェクトにカプセル化されるのではなく、祝福されたハッシュ($object->{attribute})からオブジェクト属性にアクセスすることを期待するレガシーコードによって呼び出される新しいオブジェクトが作成される状況では、属性が正しく機能するためには、オブジェクトを祝福されたハッシュリファレンスとして保存する必要があることを明示的に定義する方法はありますか?

オブジェクトの内部表現から渡される祝福されたオブジェクトをデカップリングするモジュールがありますか?それは、インスタンス化されたメタオブジェクトに対するメソッド呼び出しに、定義済みのハッシュ・キーを結びつけることができる束縛されたハッシュを渡すことができるように思われるので、古いコードがオブジェクトを$object->{attribute} = 'blahblah'と呼んでも、

答えて

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がそれが働くのを妨げるような方法で内部を変えると想像するのは非常に難しいと思っています。だから、あなたがしようとしているのと同じくらい、実際の目的がダンプからいくつかのレガシーコードを取得するだけであれば、前進してより多くのものに移行するという本当の計画があるならば、現代的な慣行とインターフェイス違反を防ぐ。

+0

ええ、元のオブジェクトのrefへのアクセスを知っていました。明らかにメソッド修飾子のようなものは恐ろしくそれをやってしまうでしょう。 ( 'watusi => sub {warn" watusi changed! "}}')。実際にあなたの答えをhashrefアクセスコードのコメントで修正して、Googleでこれを見つけても、悪意のあるコードを盲目的にc&pすることはありません。内部ストレージを変更し、メソッドがhashrefコンテナへの呼び出しを処理できるようにするMooseXモジュールがあることを本当に望んでいました。しかし明らかにそうではありません。 – Oesor

関連する問題