【发布时间】:2018-04-07 14:28:23
【问题描述】:
我正在尝试为我的Moose 类简化一个属性类的定义。例如,考虑可以标记为private 的一类属性,下面是一个此类属性的示例:
package MyPkg;
use Moose;
has some_attribute => (
is => 'ro',
isa => 'Str',
lazy => 1,
init_arg => undef, # prevent from being set by constructor
builder => "_set_some_attribute"
);
sub _set_some_attribute {
my ( $self ) = @_;
return "value_of_some_attribute";
}
sub some_method_that_uses_some_attribute {
my ( $self ) = @_;
return "The value of some attribute: " . $self->some_attribute;
}
package main;
use feature qw(say);
use strict;
use warnings;
my $o = MyPkg->new();
say $o->some_method_that_uses_some_attribute;
假设MyPkg 类的属性some_attribute 属于一组可以标记为private 的属性,其中所有类型为private 的属性例如为lazy,并且不能由构造函数。也就是说,我想简化:
package MyPkg;
use Moose;
has some_attribute => (
is => 'ro',
isa => 'Str',
lazy => 1,
init_arg => undef, # prevent from being set by constructor
builder => "_set_some_attribute"
);
这样的事情
package MyPkg;
use Moose;
use MyMooseAttributeExtensions; # <-- some Moose extension that I have to write
has some_attribute => (is => 'ro', isa => 'Str', private => 1 );
Moose 可以做到这一点吗?
【问题讨论】:
-
我通常走低魔法路线并定义一个单独的函数,然后依次调用 Moose 提供的“has”函数。例如。
sub has_private ($name, %args) { has $name => (init_arg => undef, builder => "_set_$name", lazy => 1,%args) }.