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

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

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

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

# --- 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?

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

Ответ 1

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

use Moose::Util::TypeConstraints;

Ответ 2

Вот один, который я украл из кулинарной книги раньше:

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 );