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__
(結果は同じ)