そろそろ何したいのかわからなくなりそう。MooseでいったらRoleつけたりはずしたりしたい。継承ツリー直接いじるとか筋が悪いってレベルじゃないし。

package Foo;
sub new { bless {}, shift }

package Bar;
sub bar { 'bar' }

package main;
use Perl6::Say;

my $foo = Foo->new;

say +$foo->can('bar') ? $foo->bar : 'cant call $foo->bar'; # => cant call $foo->bar

push @Foo::ISA, 'Bar';

say +$foo->can('bar') ? $foo->bar : 'cant call $foo->bar'; # => bar

@Foo::ISA = grep { $_ ne 'Bar' } @Foo::ISA;

say +$foo->can('bar') ? $foo->bar : 'cant call $foo->bar'; # => cant call $foo->bar

Mooseadd_roleだけじゃなくremove_role的なものがあったらすぐにそれ使うんだけどなぁ。少なくとも今回はmeta->make_immutableいらないんだし。

追記

Moose@ISAいじるのもやめた。かわりにシンボルテーブルいじりまくりなコードになったし、いくつか気になる点もあるけど、とりあえず解決。