On Tue, Jun 14, 2011 at 01:56, Jesse Luehrs <d...@tozt.net> wrote: > On Mon, Jun 13, 2011 at 06:45:10PM +0200, Ævar Arnfjörð Bjarmason wrote: >> On Mon, Jun 13, 2011 at 18:39, Ævar Arnfjörð Bjarmason <ava...@gmail.com> >> wrote: >> > For Mouse this monkeypatching would work: >> >> And this would work for Moose: >> >> package Foo; >> use Moose; >> { >> package Moose::Meta::Attribute; >> >> sub verify_against_type_constraint { >> my $self = shift; >> my $val = shift; >> >> return 1 if !$self->has_type_constraint; >> >> my $type_constraint = $self->type_constraint; >> >> $type_constraint->check($val) >> || Carp::cluck("Attribute (" >> . $self->name >> . ") does not pass the type constraint because: " >> . $type_constraint->get_message($val), data => $val, >> @_); >> } >> } >> >> has x => (is => "ro", isa => "Int"); >> my $foo = Foo->new(x => "blah"); >> use Data::Dumper; >> print Dumper $foo; >> >> And give you: >> >> $ perl -Ilib /tmp/error.pl >> Subroutine RegexpRef redefined at >> lib/Moose/Util/TypeConstraints/OptimizedConstraints.pm line 35. >> Subroutine verify_against_type_constraint redefined at /tmp/error.pl >> line 6. >> Attribute (x) does not pass the type constraint because: >> Validation failed for 'Int' with value >> blahdatablahinstanceFoo=HASH(0x1edadb0) at /tmp/error.pl line 14 >> >> Moose::Meta::Attribute::verify_against_type_constraint('Moose::Meta::Attribute=HASH(0x27e0078)', >> 'blah', 'instance', 'Foo=HASH(0x1edadb0)') called at >> lib/Moose/Meta/Attribute.pm line 1125 >> >> Moose::Meta::Attribute::_coerce_and_verify('Moose::Meta::Attribute=HASH(0x27e0078)', >> 'blah', 'Foo=HASH(0x1edadb0)') called at lib/Moose/Meta/Attribute.pm >> line 485 >> >> Moose::Meta::Attribute::initialize_instance_slot('Moose::Meta::Attribute=HASH(0x27e0078)', >> 'Moose::Meta::Instance=HASH(0x27ad5c0)', 'Foo=HASH(0x1edadb0)', >> 'HASH(0x1ec8f90)') called at lib/Class/MOP/Class.pm line 575 >> >> Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x266bab0)', >> 'HASH(0x1ec8f90)') called at lib/Class/MOP/Class.pm line 548 >> >> Class::MOP::Class::new_object('Moose::Meta::Class=HASH(0x266bab0)', >> 'HASH(0x1ec8f90)') called at lib/Moose/Meta/Class.pm line 252 >> >> Moose::Meta::Class::new_object('Moose::Meta::Class=HASH(0x266bab0)', >> 'HASH(0x1ec8f90)') called at lib/Moose/Object.pm line 22 >> Moose::Object::new('Foo', 'x', 'blah') called at >> /tmp/error.pl line 23 >> $VAR1 = bless( { >> 'x' => 'blah' >> }, 'Foo' ); >> > > For the record, please please PLEASE don't do this. Attribute traits > exist for a reason.
How would you accomplish the same thing with attribute traits?