Как заметил bvr
, вы перевернули свои аргументы, чтобы благословить конструктор.Так что, хотя это и является непосредственной проблемой для вашего кода, при написании методов повторной отправки важно учитывать использование синтаксиса goto &sub
для стирания стекового кадра вызова AUTOLOAD
:
sub AUTOLOAD
{
my ($name) = our $AUTOLOAD =~ /::(\w+)$/;
Log::method_call( $name, @_ );
my $self = shift;
# return $$self->$name( @_ ); # instead of this, use the following:
unshift @_, $$self; # setup argument list
goto &{ $$self->can($name) } # jump to method
}
Если пересылкаМетод использует встроенную функцию caller
для чего-либо (установка методов, локализация переменных, Carp
сообщение об ошибке ...), тогда эта техника будет поддерживать правильную работу caller
.Использование исходной строки return $$self->$name(@_)
всегда сообщало бы, что caller
была последней строкой подпрограммы AUTOLOAD
, что, в свою очередь, могло бы стать источником труднодоступных ошибок.
Если вы хотите улучшитьНемного сообщив об ошибке, вы могли бы написать последнюю строку как:
goto &{ $$self->can($name) or Carp::croak "no method '$name' on $$self" };
Что предполагает, что пакет Carp
был загружен.