Re: Sub::Spyとか作った、けどナントカの夜は明けない
Sub::Spyとか作った、けどナントカの夜は明けない
要は「コードリファレンスにプロパティをつけたいけどblessはしたくない」ってことですよね。
それ、InsideOut法でできますよ。下記のように関数インターフェイスになってしまっていいならHash::FieldHashを使うだけです。
#!perl -w use 5.12.0; use Hash::FieldHash qw(fieldhash); use Guard qw(guard); fieldhash my %guard_of; sub guard_of { my($thing) = @_; return $guard_of{$thing}; } { my $value = 'Hello'; my $closure = sub { $value }; $guard_of{$closure} = guard { say "destroyed!" }; say guard_of($closure); } say 'end.'; __END__ Guard=SCALAR(0x10082c008) destroyed! end.
どうしてもメソッドとして呼びたいならautoboxを使えばできます。ただ名前空間が型ごとにしかないので奨励はしませんが。
#!perl -w use 5.12.0; use Hash::FieldHash qw(fieldhash); use autobox; use Guard qw(guard); fieldhash my %guard_of => 'guard', 'CODE'; { my $value = 'Hello'; my $closure = sub { $value }; $guard_of{$closure} = guard { say "destroyed!" }; say $closure->guard; } say 'end.'; __END__ (結果は同じ)