2013-03-27 2 views
1

Я не могу переопределить уже объявленный атрибут в роли с MooseX::Declare.Переопределить атрибут по умолчанию при использовании роли Moose

use MooseX::Declare; 

role Person { 
has 'name' => (
    is => 'ro', 
    isa => 'Str', 
    default => 'John', 
    ); 
} 

class Me with Person { 
has '+name' => (
     default => 'Michael', 
    ); 
} 

ошибка, которая, как сообщается, выполнив код:

Could not find an attribute by the name of 'name' to inherit from in Me at /usr/lib/perl5/Moose/Meta/Class.pm line 711 
Moose::Meta::Class::_process_inherited_attribute('Moose::Meta::Class=HASH(0x2b20628)', 'name', 'default', 'Michael', 'definition_context', 'HASH(0x114fd38)') called at /usr/lib/perl5/Moose/Meta/Class.pm line 694 
Moose::Meta::Class::_process_attribute('Moose::Meta::Class=HASH(0x2b20628)', '+name', 'default', 'Michael', 'definition_context', 'HASH(0x114fd38)') called at /usr/lib/perl5/Moose/Meta/Class.pm line 566 
Moose::Meta::Class::add_attribute('Moose::Meta::Class=HASH(0x2b20628)', '+name', 'default', 'Michael', 'definition_context', 'HASH(0x114fd38)') called at /usr/lib/perl5/Moose.pm line 79 
Moose::has('Moose::Meta::Class=HASH(0x2b20628)', '+name', 'default', 'Michael') called at /usr/lib/perl5/Moose/Exporter.pm line 370 
Moose::has('+name', 'default', 'Michael') called at Test.pm line 12 
main::__ANON__() called at /usr/share/perl5/MooseX/Declare/Syntax/MooseSetup.pm line 81 
MooseX::Declare::Syntax::MooseSetup::__ANON__('CODE(0x2b0be20)') called at Test.pm line 21 

Это работает, но его не на основе ролей:

class Person { 
has 'name' => (
    is => 'ro', 
    isa => 'Str', 
    default => 'John', 
    ); 
} 

class Me extends Person { 
has '+name' => (
    default => 'Michael', 
    ); 
} 

Что случилось с моим кодом при использовании ролей ? Нет ли возможности переопределить поведение атрибута?

+1

Пожалуйста, разместите свой собственный ответ как реальный ответ ниже, а не редактируйте свой вопрос и примите его. Это помогает другим людям найти его, и ваш вопрос больше не выглядит так, как без ответа. – simbabque

+2

Я буду делать, когда таймер ушел, что я не могу ответить на свой вопрос. Я думал, что было бы полезно опубликовать уже найденное решение, иначе люди попытаются помочь в решении уже решенной проблемы. – mino

+0

Я исправил его сейчас :) – mino

ответ

3

Пользователь ИРКе в irc.perl.org #moose дал решение:

<phaylon> iirc MX:Declare will consume the roles declared in the block at the end. try with 'Person'; in the class block before the has 

Так следующий код работает в настоящее время:

use MooseX::Declare; 

role Person { 
    has 'name' => (
    is => 'ro', 
    isa => 'Str', 
    default => 'John', 
); 
} 

class Me { 
    with 'Person'; 

    has '+name' => (
    default => 'Michael', 
); 
} 

большое спасибо phaylon.

Смежные вопросы