X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMethod%2FGenerate%2FAccessor.pm;fp=lib%2FMethod%2FGenerate%2FAccessor.pm;h=cdba23fe19786c6eee524dbf222670fe0649616f;hb=7887ffd0e1ad2fb8ce47acf35c23cdb14d47b151;hp=2f2e334b9544ddd05cd0d98e6aebfa3ee6dbd762;hpb=1f07812d7a6146b73c3bb772b2b9ab799e1c26ef;p=gitmo%2FMoo.git diff --git a/lib/Method/Generate/Accessor.pm b/lib/Method/Generate/Accessor.pm index 2f2e334..cdba23f 100644 --- a/lib/Method/Generate/Accessor.pm +++ b/lib/Method/Generate/Accessor.pm @@ -66,28 +66,26 @@ sub generate_method { $spec->{trigger} = quote_sub('shift->_trigger_'.$name.'(@_)'); } - if (exists $spec->{coerce}) { - my $value = $spec->{coerce}; - my $invalid = "Invalid coerce '" . overload::StrVal($value) - . "' for $into->$name - not a coderef"; - die "$invalid or code-convertible object" - unless ref $value and (ref $value eq 'CODE' or blessed($value)); - die "$invalid and could not be converted to a coderef: $@" - if !eval { \&$value }; + for my $setting (qw( isa coerce )) { + next if !exists $spec->{$setting}; + $self->_validate_codulatable($setting, $spec->{$setting}, "$into->$name"); } if (exists $spec->{default}) { - my $value = $spec->{default}; - if (!defined $value || ref $value) { - my $invalid = "Invalid default '" . overload::StrVal($value) - . "' for $into->$name - not a coderef or non-ref"; - die "$invalid or code-convertible object" - unless ref $value and (ref $value eq 'CODE' or blessed($value)); - die "$invalid and could not be converted to a coderef: $@" - if !eval { \&$value }; + if (!defined $spec->{default} || ref $spec->{default}) { + $self->_validate_codulatable('default', $spec->{default}, "$into->$name", 'or a non-ref'); } } + if (exists $spec->{moosify}) { + if (ref $spec->{moosify} ne 'ARRAY') { + $spec->{moosify} = [$spec->{moosify}]; + } + + for my $spec (@{$spec->{moosify}}) { + $self->_validate_codulatable('moosify', $spec, "$into->$name"); + } + } my %methods; if (my $reader = $spec->{reader}) { @@ -570,4 +568,16 @@ sub _generate_xs { sub default_construction_string { '{}' } +sub _validate_codulatable { + my ($self, $setting, $value, $into, $appended) = @_; + $appended ||= ''; + my $invalid = "Invalid $setting '" . overload::StrVal($value) + . "' for $into not a coderef $appended"; + die "$invalid or code-convertible object" + unless ref $value and (ref $value eq 'CODE' or blessed($value)); + die "$invalid and could not be converted to a coderef: $@" + if !eval { \&$value }; + 1; +} + 1;