2016-09-08 29 views
1

次のコードのように、PerlクロージャをMooアクセサに変換しようとしています。残念ながら、コードはMooseで動作しますが、Mooでは例外がスローされます。動的に生成されたPerl 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

武さんhasaccessorオプションを持っていないようです。

#!/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

関連する問題