Как вы создаете подтипы в Moose? - PullRequest
10 голосов
/ 21 марта 2009

Я только начинаю использовать Лось .

Я создаю простой объект уведомления и хотел бы проверить входные данные типа «Электронная почта». (Игнорируем пока простое совпадение регулярных выражений).

Из документации я считаю, что это должно выглядеть следующим образом:

# --- contents of message.pl --- #
package Message;
use Moose;

subtype 'Email' => as 'Str' => where { /.*@.*/ } ;

has 'subject' => ( isa => 'Str', is => 'rw',);
has 'to'      => ( isa => 'Email', is => 'rw',);

no Moose; 1;
#############################
package main;

my $msg = Message->new( 
    subject => 'Hello, World!', 
    to => 'coolkids@example.com' 
);  
print $msg->{to} . "\n";

но я получаю следующие ошибки:

String found where operator expected at message.pl line 5, near "subtype 'Email'"
    (Do you need to predeclare subtype?)
String found where operator expected at message.pl line 5, near "as 'Str'"
    (Do you need to predeclare as?)
syntax error at message.pl line 5, near "subtype 'Email'"
BEGIN not safe after errors--compilation aborted at message.pl line 10.

Кто-нибудь знает, как создать собственный подтип Email в Moose?

Moose-версия: 0,72 Perl-версия: 5.10.0, платформа: linux-ubuntu 8.10

Ответы [ 2 ]

14 голосов
/ 21 марта 2009

Я также новичок в Moose, но я думаю, что для подтипа вам нужно добавить

use Moose::Util::TypeConstraints;
10 голосов
/ 21 марта 2009

Вот что я украл из поваренной книги ранее:

package MyPackage;
use Moose;
use Email::Valid;
use Moose::Util::TypeConstraints;

subtype 'Email'
   => as 'Str'
   => where { Email::Valid->address($_) }
   => message { "$_ is not a valid email address" };

has 'email'        => (is =>'ro' , isa => 'Email', required => 1 );
...