2010-11-18 18 views
2

私は次の5つのムース属性を持っている: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. メイク(初期化されていない)属性が呼び出されたサブ状態(例:"Attribute 'summary_file' not set")。

私は5つの別々のhasを書いて上記を達成できますが、もっとコンパクトな方法がありますか?あなたは(あなたが以下のコメントを「動作しない」の後に、新たな実施例)を、次のような何かを行うことができ

答えて

4

:あなたはdefaultbuilderの両方を指定することができないこと

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); 

注意。

@Oesorは、私が忘れてしまったコメント何かで指摘:

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

または、lazy_buildを宣言するだけです。デフォルトは_build_ $ accessorです。 – Oesor

+2

@Oesor:その場合、あなたは公式の述語を取得し、より明確になりますが、これはしばしば望ましくありません。ドキュメント 'lazy_build'による – Ether

+0

も' required'をtrueに設定します。これは何を意味するのでしょうか? –

0

あなたはそれが値が設定されていないときMooseX::LazyRequireを見て、アクセス上の例外をスローする属性を探しているなら。

呼び出されたときに警告をスローするビルダーを探している場合は、そのステートメントをビルダーメソッドに含めるか、アクセサー/リーダーメソッドをラップします。あなたは同じ命名規則のlazy_buildを使用して属性にビルダーメソッドを指定する方法を探しているなら(例えば「before 'attribute_name' => sub { ...complain... };」)

MooseX::AttributeShortcutsは(「builder => "_build_${attribute_name}"」として 『builder => 1』をサポート)を参照してくださいありません。

関連する問題