自分のクラスを変更する

クラスがコロコロ変化するというのをやってみたかったのでやってみた。

use warnings;
use strict;

{
    package Alphabet;

    sub new {
        bless {}, (shift);
    }

    sub next {
        my $self = shift;
        my $l = $self->letter;
        bless $self, ++$l;
    }

    sub prev {
        my $self = shift;
        my $l = $self->letter;
        $l =~ tr/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ZABCDEFGHIJKLMNOPQRSTUVWXY/;
        bless $self, $l;
    }

    sub show {
        my $self = shift;
        print lc($self->letter);
        $self;
    }

    sub SHOW {
        my $self = shift;
        print $self->letter;
        $self;
    }
}

sub defineAlphabet {
    my $letter = shift;
    eval "{ package $letter; use base qw(Alphabet); sub letter {\"$letter\"} }"
}

defineAlphabet($_) for "A".."Z";

my $x = "H"->new;

$x->SHOW->prev->prev->prev->show->next->next->next->next->next->next->next->show->show->next->next->next->show;

print " ";

$x->next->next->next->next->next->next->next->next->SHOW->prev->prev->prev->prev->prev->prev->prev->prev->show;
$x->next->next->next->show->prev->prev->prev->prev->prev->prev->show->prev->prev->prev->prev->prev->prev->prev->prev->show;

print "!\n";