2016-09-08 6 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

не кажется Moo-х 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