非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
我知道驼鹿,但问题是穆斯不是标准Perl安装的一部分,并且将模块下载到许多我使用的系统是不可能的。我必须让SysAdmin来做到这一点。 – 2010-11-10 03:11:37
@David:围绕这个问题有办法。请参阅http://www.shadowcat.co.uk/blog/matt-s-trout/but-i-cant-use-cpan/。 – Ether 2010-11-10 05:07:25