0

ビルダーメソッドを介して消費クラスに入力される必須属性の Role で after 修飾子を使用することは可能ですか?

package A::Role;
use Moose::Role;
use IO::File;
use Carp;

requires 'properties_file';

after 'properties_file' => sub {
     my $self = shift;

     $self->_check_prop_file();
     $self->_read_file();
};

消費クラス:

    package A::B::C;
    use Moose;
    use Carp;
    use Moose;
    use Carp;
    use HA::Connection::SSH;
    use constant {
     ...
    };

    has 'properties_file' => ( is  => 'ro',
                               isa => 'Str',
                               builder => '_build_current_data');

    with 'A::Role';
    sub _build_current_data { ... }
4

1 に答える 1

0

あなたの質問に答えるために:はい、できます。アクセサメソッドが生成されるように属性を宣言した後、ロールを消費するという重要な部分はすでに完了しています。

したがって、指定したコードは、期待する順序で実行されます。-

my $c = A::B::C->new;
# 'properties_file' is built by _build_current_data()

my $filename = $c->properties_file;
# _check_prop_file() and _read_file() are executed (but before $filename is assigned)

ただし、を取得 してプロパティファイルのチェックと読み取りを呼び出すのは奇妙に思えますproperties_file。構築後にプロパティファイルをチェックして自動的に読み取るだけの場合、ロールBUILDはクラスで使用されるメソッドを提供できます。(BUILD建設後に実行されるため、properties_fileすでに初期化されています。)

sub BUILD {
    my $self = shift;
    $self->_check_prop_file();
    $self->_read_file();
    return;
}
于 2013-02-18T17:03:57.260 に答える