2009-03-21 2 views
10

Я только начинаю использовать 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. 

Любой знает, как создать пользовательский E-mail подтип в Moose?

Муз-версия: 0,72 Perl-версия: 5.10.0, Платформа: Linux-убунту 8,10

ответ

14

Я новичок в Moose, как хорошо, но я думаю, что для subtype, вам нужно добавить

use Moose::Util::TypeConstraints; 
10

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

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

Email :: Правильные ++ # для проверки регулярных выражений почты зло – brunov

+4

@bruno v - & Email :: Valid :: rfc822 использует регулярное выражение для проверки. – converter42