PadWalkerという呪文でレキシカル変数を外から見る

Re: http://d.hatena.ne.jp/tokuhirom/20090319/1237428528


PadWalker(PadWalker - play with other peoples' lexical variables - metacpan.org
という呪文でも、こざかしいテクニックを打ち破る事ができます。
コードはこちら。

{
    package F;
    use strict;
    use warnings;

    use Class::InsideOut qw'public readonly private register id new';
    private name => my %name;
    sub greeting {
        my $self = shift;
        return "hello, my name is $name{id $self}";
    }
}

{
    package main;
    use Data::Dumper;

    my $f = F->new( { name => 'dankogai' } );
    warn Dumper($f);
    print $f->greeting, "\n";

    use PadWalker qw(peek_sub);
    my $scope = peek_sub( $f->can('greeting') );
    warn Dumper($scope);

    $scope->{'%name'}->{ id $f} = 'holidays-l';
    warn Dumper($scope);
    print $f->greeting, "\n";
}


id:tokuhiromのコードと実行結果が少し違いますが、中身見れますし書き換えも出来ます。

$VAR1 = bless( do{\(my $o = undef)}, 'F' );
hello, my name is dankogai
$VAR1 = {
          '%name' => {
                       '268943024' => 'dankogai'
                     },
          '$self' => \undef
        };
$VAR1 = {
          '%name' => {
                       '268943024' => 'holidays-l'
                     },
          '$self' => \undef
        };
hello, my name is holidays-l