非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