2016-09-08 33 views
1

我尝试将Perl闭包变为Moo访问器,如下面的代码所示。不幸的是,代码与Moose一起工作,但与Moo一起抛出异常。Perl Moo,动态生成的访问器

请帮我写一个Moo代码,它带有由Perl闭包定义的读写访问器(不是读取和存储简单值的默认访问器,而是读取和写入应该调用我的闭包的访问器)。

#!/usr/bin/perl 

package X; 
use Moo; 

my $BusinessClass = "X"; 
my $Key = 'zz'; 

no strict 'refs'; 
*{"${BusinessClass}::access_$Key"} = sub { "Modified $Key" }; 
has $Key => (is  => 'rw', 
       required => 0, 
       accessor => { $Key => \&{"${BusinessClass}::access_$Key"} }, 
       # predicate => { "has_$Key",\&{"${BusinessClass}::access2_$Key"} }, 
      ); 

my $obj = X->new; 
print $obj->zz, "\n"; 

回答

1

哞的has似乎并不有一个accessor选项。

#!/usr/bin/perl 

package X; 

use Moo; 
use feature qw(say); 

for my $attr_name (qw(zz)) { 
    eval(<<'__EOS__' =~ s/ATTR_NAME/$attr_name/gr) or die([email protected]); 
     sub ATTR_NAME { 
      my $self = shift; 
      @_ ? $self->_set_ATTR_NAME($_[0]) : $self->_get_ATTR_NAME() 
     } 

     1; # No exception 
__EOS__ 

    has $attr_name => (
     is  => 'rw', 
     required => 0, 
     reader => '_get_'.$attr_name, 
     writer => '_set_'.$attr_name, 
    ); 
} 

my $obj = X->new; 
$obj->zz("abc"); 
say $obj->zz; 

未经测试。

+0

在./test2.pl第27行使用未初始化的值。 – porton

+0

酷,似乎已经工作。如果你真的先给它一个价值,你会得到更漂亮的东西。更新。 – ikegami