Perlで匿名クラスを書いてみる、の巻

 id:nekokakさんの最近のエントリ(ANONクラスの生成 - Hatena::Diary::Neko::kak 500 Internal Server Error)を読んで、自分でも試してみた。
 ついでに、globの勉強。

#!/usr/bin/env perl

# anonclass_test.pl

use strict;
use warnings;

{

    package Hoge;

    sub new {
        return bless {}, shift;
    }

    sub hoge {
        my $self = shift;
        if (@_) {
            $self->{hoge} = $_[0];
        }
        $self->{hoge};
    }
}

my $pkg = 'Fuga';

{
    no strict 'refs';
    @{"$pkg\::ISA"}  = qw/Hoge/;
    ${"$pkg\::foo"} = 'foo';
    *{"$pkg\::fuga"} = sub {
        my $self = shift;
        if (@_) {
            $self->{fuga} = $_[0];
        }
        return ${"${pkg}::foo"} . " -> " . $self->{fuga} . "!!!!!";
      }
}

my $f = $pkg->new;

print $f->hoge('test'), "\n";
print $f->fuga('piyo'), "\n";

% perl anonclass_test.pl
test
foo -> piyo!!!!!

 Fuga::fugaメソッドからFuga::fooの変数にアクセスするためには、もっといい書き方がある気がする…