Hi Moosers, I am quite new to Moose, at least I don't use all the power of it. Anyway, I tried to create a subtype called 'ArrayRefOrHashRef' to be able to have an attribute that could accept and array ref or a hash ref. My idea is to :
1) If the parameter passed to my attribute is an array ref, work with it and then create a hash ref at the end 2) It the parameter passed to my attribute is a hash ref, check some stuff then return it modified or not. Here is my code : subtype 'ArrayRefOrHashRef' => as 'Ref' => where { ref($_) eq 'ARRAY' or ref($_) eq 'HASH' }; coerce 'ArrayRefOrHashRef' => from 'ArrayRef' => via { my $hash = { }; foreach my $type (@{$_}){ throw Bio::Root::BadParameter( "Wrong type value '$type' [cohesive|blunt]!") unless($type =~ /^[cohesive|blunt]$/o); $hash->{$type} = $type eq 'cohesive' ? [qw/5' 3'/] : [qw/blunt/]; } return $_ = $hash; } => from 'HashRef' => via { #do some stuff with hash ref. }; later on: has 'cut_types' => ( is => 'ro', isa => 'ArrayRefOrHashRef', coerce => 1, required => 1, default => sub { {'cohesive' => [qw/5' 3'/], 'blunt' => [qw/blunt/]} }, ); However,if I passed an array ref to 'cut_types' it does not get transform to a hash ref. my $t = Object->new(-cut_types => ['foo']); #then $t->cut_types() returns an array ref :( So can somebody tell me what I am doing wrong? Also, is there a way to get some value or text printed from inside the coercion code ? Thanks in advance Regards Emmanuel -- ------------------------- Emmanuel Quevillon Biological Software and Databases Group Institut Pasteur +33 1 44 38 95 98 tuco at_ pasteur dot fr -------------------------