Perl Moose具有多个相互依赖的属性



如何创建我的Perl Moose类,以便以正确的顺序构建多个相互依赖的属性?就我而言,我想从主配置文件中指定的配置文件配置我的 Log::Log4perl 对象。

如果初始化确实是相互依赖的,那么您会遇到问题,因为其中一个属性必须在另一个属性之前初始化。但是您的描述不支持这一点。听起来创建记录器需要配置文件,仅此而已。

只要让logger的创作变得懒惰,给config一个被设定的机会。

package Class;
use Moose;
has config => ( ... );
has logger => (
isa     => 'Str',
is      => 'ro',
lazy    => 1,
default => sub {
my $self = shift;
my $config = $self->config
or die(...);
return Log::Log4perl->get_logger( $config->{logger} );
},
handles => [qw( info warn error fatal )],
);

示例用法

my $o = Class->new( config => "..." );
$o->warn("...");

# Assuming config isn't required=>1.
my $o = Class->new();
$o->config("...");
$o->warn("...");

可以使用before方法修饰符(方法挂钩(强制按特定顺序构建属性:

package Z;
use Moose;
has config => (
isa     => 'HashRef',
is      => 'ro',
lazy    => 1,
default => sub { print STDERR "called 'config'n"; return { a => 'b' }; },
);
has logger => (
isa     => 'Str',
is      => 'ro',
lazy    => 1,
default => sub { print STDERR "called 'logger'n"; return 'Fred'; }
);
before 'logger' => sub {
my $self = shift;
print STDERR "called before 'logger'n";
die "No logger!: $!n" if !defined $self->config;
return;
};
package A;
my $z = Z->new();
print "logger: ", $z->logger, "n";
print "config{a}: ", $z->config->{a}, "n";

此示例代码的输出,显示config是在通过before方法修饰符logger之前构建的:

called before 'logger'
called 'config'
called 'logger'
logger: Fred
config{a}: b

最新更新