Charles,
You have indeed found a bug, using the accessor directly behaves
correctly, but using the constructor does not behave correctly. I am
busy with work stuff right now, but I will fix this ASAP and it will
be in the next release.
- Stevan
On Apr 9, 2008, at 2:40 PM, Charles Alderman wrote:
Hello,
Just started using Moose (love it). I recently spent a little time
struggling through an issue with trigger arguments for a coerced
attribute. So, I thought I'd post what I found here in case anyone
else runs into it.
Actually, I'm not sure if I found an undocumented feature of Moose,
or if it's a bug. The docs say that a trigger is passed an updated
value of the attribute. What happens is that if the attribute has
a coercion, the argument passed to the trigger hasn't been
coerced. So, technically, the argument isn't an updated value.
(At least, that's where my confusion came from.)
The coerced value is still available to the trigger through the
attribute's accessor, so maybe having the non-coerced value also
available is for the best.
For clarification, I included an example.
Thanks,
Charles Alderman
aldermania.com
Versions:
Moose - 0.40
Class::MOP - 0.54
--
From the Moose perldoc:
The trigger option is a CODE reference which will be called after
the value of the attribute is set. The CODE ref will be passed the
instance itself, the **updated value** and the attribute meta-
object (this is for more advanced fiddling and can typically be
ignored).
--
Here's an example:
#This example is based on: Schwartz, R.L. "The Moose is Flying
(part 2)". LinuxMag Column 95 (Jul 2007)
package Mortgage;
use Moose;
use Moose::Util::TypeConstraints;
use DateTime;
use DateTime::Format::DateManip;
use Date::Manip;
Date_Init( 'TZ=US/Eastern' );
subtype 'DateTime'
=> as 'Object'
=> where { $_->isa('DateTime') };
coerce 'DateTime'
=> from 'Str' => via { DateTime::Format::DateManip-
>parse_datetime($_) }
=> from 'HashRef' => via { DateTime->new(%$_) };
has 'closing_date' => (
is => 'rw',
isa => 'DateTime',
coerce => 1,
trigger => sub {
my ( $self, $val, $meta ) = @_;
print $self->closing_date->isa('DateTime') ? 'yes' : 'no'; # yes
print $val->isa('DateTime') ? 'yes' : 'no'; #
no???
}
);
1;
package main;
my $mtg = Mortgage->new( closing_date => 'yesterday' );
print $mtg->closing_date->isa('DateTime') ? 'yes' : 'no'; # yes