【问题标题】:Moose and Roles method modifersMoose 和 Roles 方法修饰符
【发布时间】:2013-02-02 18:05:23
【问题描述】:

是否可以在 Role 中使用 after 修饰符来表示通过 builder 方法填充到消费类中的必需属性?

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 { ... }

【问题讨论】:

  • 你想达到什么目的? _read_file() 会做什么?

标签: perl oop moose method-modifier


【解决方案1】:

回答您的问题:是的,您可以。您已经完成了关键部分,即在声明属性后使用角色以便生成访问器方法。

因此,您提供的代码将按照您期望的顺序执行:-

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)

但是,您通过 getting properties_file 调用属性文件的检查和读取似乎很奇怪。如果您只想在构造后自动检查和读取属性文件,则角色可以提供BUILD 方法以供类使用。 (BUILD是在构造之后执行的,所以properties_file已经被初始化了。)

sub BUILD {
    my $self = shift;
    $self->_check_prop_file();
    $self->_read_file();
    return;
}

【讨论】:

    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 2010-12-14
    • 2012-10-30
    • 2013-09-02
    • 2012-09-04
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多