Try coercing from Undef to create a default DateTime instance.

- Stevan

package Foo;

use Moose;
use Moose::Util::TypeConstraints;
use DateTime;
use DateTime::Format::Natural;

subtype 'BRK::DT' => as class_type('DateTime');

coerce 'BRK::DT'
    => from 'Str'
    => via { DateTime::Format::Natural->new->parse_datetime($_) }
    => from 'Undef'
    => via { DateTime->now };

has start => (is => 'rw', isa => 'BRK::DT', coerce => 1);

package main;

my $foo = Foo->new;

my $date;
#$date = '2010-05-01';

$foo->start($date);

print $foo->start->month_name;

__END__


On Jun 14, 2010, at 5:13 PM, Octavian Rasnita wrote:

Hello,

I am trying to create a module that accepts a string property as 2010-05-01 and coerces it to DateTime by default, but that property might be also undef.

I have tried:

package Foo;

use Moose;
use Moose::Util::TypeConstraints;
use DateTime;
use DateTime::Format::Natural;

subtype 'BRK::DT' => as class_type('DateTime');

coerce 'BRK::DT' => from 'Str' => via {DateTime::Format::Natural- >new->parse_datetime($_)};

has start => (is => 'rw', isa => 'Maybe[BRK::DT]', coerce => 1);

package main;

my $foo = Foo->new;

my $date;
$date = '2010-05-01';

$foo->start($date);

print $foo->start->month_name;

__END__

This program works, but if I comment the following line:
$date = '2010-05-01';

than it gives the error:

Cannot coerce without a type coercion at e:/usr/site/lib/Moose/Meta/ TypeConstraint.pm line 83 Moose ::Meta ::TypeConstraint ::coerce ('Moose::Meta::TypeConstraint::Parameterized=HASH(0x2570c8c)', '2010-05-01') called at accessor start defined at E:\lucru\moose \test8.pl line 16 Foo::start('Foo=HASH(0x256de04)', '2010-05-01') called at E:\lucru \moose\test8.pl line 20

Thank you for your help.

Octavian


Reply via email to