Допустим, у нас есть класс Moose, подобный так:
package My::Test ;
use Moose ;
$\="\n";
sub BUILDARGS {
my ($pkg,%args) = @_ ;
print defined wantarray ? 'BUILDARGS: SCALAR':'BUILDARGS: VOID' ;
return \%args ;
}
sub BUILD {
print defined wantarray ? 'BUILD: SCALAR':'BUILD: VOID' ;
my ( $self, $args ) = @_ ;
print '---' ;
}
1;
Создавая класс в контексте SCALAR и VOID, я получаю всегда один и тот же вывод:
#!/usr/bin/perl
use Moose ;
use My::Test ;
# Scalar ctx
my $instance = My::Test->new ;
# Void ctx
My::Test->new ;
Вывод:
BUILDARGS: SCALAR
BUILD: VOID
---
BUILDARGS: SCALAR
BUILD: VOID
Мне удалось получить контекст, обертывающий создание экземпляра класса Moose в тривиальный пакет и передававший контекст как атрибут конструктора следующим образом:
package My::Wrapper ;
use My::Test ;
sub new {
my ( $class , %args ) = @_ ;
return My::Test->new(%args , ctx => defined wantarray ? 'scalar':'void') ;
}
1 ;
, но я хотел бы знать если есть более чистый способ сделать это.