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 <avarab@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.
-doy
Thread Previous
|
Thread Next