Как вы создаете подтипы в Moose?

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

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

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

# --- 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 => '[email protected]' 
);  
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.

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

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


person CoffeeMonster    schedule 21.03.2009    source источник


Ответы (2)


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

use Moose::Util::TypeConstraints;
person oylenshpeegul    schedule 21.03.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 );
person singingfish    schedule 21.03.2009
comment
Email :: Valid ++ # регулярные выражения для проверки почты - зло - person brunov; 02.04.2009
comment
@brunov - & Email :: Valid :: rfc822 использует регулярное выражение для проверки. - person converter42; 25.04.2009