Moose 以外の解決策は、シンボル テーブルにエイリアスを作成することです。これは一般的なことではありません。あなたがやろうとしていることは、ムースであろうとなかろうと、もっと良い方法があるのではないかと思います。より良いデザインやインターフェイスで回避できる場合は、これを使用しないでください。これは、多くの場合、このようなことに対する優れたソリューションです。
このAUTOLOAD
ルーチンでは、%Aliases
ハッシュを調べて、定義する必要のある他のメソッドを見つけます。エイリアスがある場合は、シンボル テーブルに適切なエイリアスを作成します。少し醜いですが、コールスタックに別の実際のメソッドを追加することを回避します:
#!perl
use 5.010;
{
package SomeClass;
use Carp;
use vars qw($AUTOLOAD);
sub new {
return bless {
map { $_, undef } qw(FOO BAR FOOBAR)
}, $_[0];
};
my %Aliases = (
FOO => [ qw(fu) ],
);
sub AUTOLOAD {
our $method = $AUTOLOAD;
$method =~ s/.*:://;
carp "Autoloading $method";
{
no strict 'refs';
*{"$method"} = sub {
@_ > 1
?
$_[0]->{"\U$method"} = $_[1]
:
$_[0]->{"\U$method"}
};
foreach my $alias ( @{ $Aliases{"\U$method"} } ) {
*{"$alias"} = *{"$method"};
}
goto &{"$method"};
}
}
sub DESTROY { 1 }
}
my $object = SomeClass->new;
$object->foo(5);
say "Foo is now ", $object->foo;
say "Foo is now ", $object->foo(9);
say "Fu is now ", $object->fu;
say "Fu is set to ", $object->fu(17);
say "Foo is now ", $object->foo;
次に、同じものfoo
にアクセスします。fu
Foo is now 5
Foo is now 9
Fu is now 9
Fu is set to 17
Foo is now 17