如何在Moose对象中设置一组属性构建器?

时间:2010-11-18 19:16:56

标签: perl moose

我有以下五个麋鹿属性:

has ['summary_file', 'html_file', 'url1', 'url2', 'txt_file'] => (
    is       => 'rw',
    isa      => 'Str',
    required => 0,
    lazy     => 1,
    default  => sub { confess "Attribute not set"; },
    );

我想:

  1. 让每个人都使用自己的构建器(例如设置'summary_file'使用_build_summary_file等。)
  2. 设置默认confess子状态,其中调用了(未初始化)属性(例如"Attribute 'summary_file' not set")。
  3. 我可以通过编写五个单独的has来完成上述操作,但也许有更简洁的方法?

2 个答案:

答案 0 :(得分:4)

您可以执行以下操作(下面的“不工作”评论后的新工作示例):

package My::Class;
use Moose;
use namespace::autoclean;

for my $attr (qw(x y)) {
    has $attr => (
        is       => 'rw',
        isa      => 'Str',
        required => 0,
        lazy     => 1,
        builder  => "_build_$attr",
    );
}

sub _build_x { rand }
sub _build_y { rand }

__PACKAGE__->meta->make_immutable;

package main;

use strict; use warnings;

my $o = My::Class->new;

print $o->$_, "\n" for qw(x y);

请注意,您无法同时指定defaultbuilder

@Oesor在评论中指出我忘了:

has ['summary_file', 'html_file', 'url1', 'url2', 'txt_file'] => (
    is         => 'rw',
    isa        => 'Str',
    required   => 0,
    lazy_build => 1,
);

答案 1 :(得分:0)

如果您正在寻找一个属性,以便在没有设置值时在访问时抛出异常,请查看MooseX::LazyRequire

如果您正在寻找一个构建器,如果它被调用则抛出警告,请在构建器方法中包含该语句...或者使用访问器/阅读器方法来执行此操作。 (例如“before 'attribute_name' => sub { ...complain... };”)

如果您正在寻找一种使用lazy_build使用相同命名约定为属性指定构建器方法的方法,请参阅MooseX::AttributeShortcuts(支持“builder => 1”为“builder => "_build_${attribute_name}"”)