エイリアスメソッドの作成方法

最初に書いたものはいささかトンチキなことをしていたので再度書き直し。fbisさんがエイリアスメソッドの作成方法で書かれていた

あと、問題点としてはgoto使うにしても型グロブ使うにしてもClass::C3とかでhogeメソッド内でnext::methodを使ってる場合は

hoge_aliasメソッドではなくhogeメソッドに行ってしまうところかな。

 package Hoge;
 use strict;
 
 sub hoge_alias { print "Hoge::hoge_alias\n" }
 sub hoge       { print "Hoge::hoge\n"       }
 
 package Muge;
 use strict;
 use base qw/Hoge/;
 use Class::C3;
 
 sub hoge {
     my $self = shift;
     $self->next::method;
 }
 sub hoge_alias; *hoge_alias = \&hoge;
 
 Muge->hoge_alias; # Hoge::hoge と表示される

これはどうしようも無いのかな。

Class::C3を使ってるようなメソッドのエイリアスを作ることはコピペ以外に原理的には不可能?

という話、AUTOLOADを使えばいいのかな、と。

 package Hoge;
 use strict;
 use warnings;
 
 sub hoge_alias { print "Hoge::hoge_alias\n" }
 sub hoge       { print "Hoge::hoge\n"       }
 
 package Muge;
 use strict;
 use warnings;
 use base qw/Hoge/;
 use Class::C3;
 our $AUTOLOAD;
 
 sub hoge {
     my $self = shift;
     $self->next::method;
 }
 
 sub AUTOLOAD {
     my $self = shift;
     return if $AUTOLOAD =~ /::DESTROY$/;
     if ($AUTOLOAD =~ /::hoge_alias$/) {
         *$AUTOLOAD = \&hoge;
         goto &$AUTOLOAD;
     }
     die "Undefined subroutine &$AUTOLOAD called";
 }

 Muge->hoge;       # Hoge::hoge と表示される
 Muge->hoge_alias; # Hoge::hoge_alias と表示される

や、これで本当に意図したものになってるかどうかはわかりませんし、Muge::hogeを定義しておく必要がないなら全部AUTOLOADの中に入れてしまえばよさそうですが、とりあえず。