package MooseX::Constructor::AllErrors::Role::Meta::Method::Constructor; BEGIN { $MooseX::Constructor::AllErrors::Role::Meta::Method::Constructor::VERSION = '0.015'; } use Moose::Role; around _generate_BUILDALL => sub { my ($orig, $self, @args) = @_; my $source = $self->$orig(@args); $source .= ";\n" if $source; my @attrs = grep { defined $_->init_arg } @{$self->_attributes}; my @required = map { "'" . $_->init_arg . "' => 1," } grep { $_->is_required && ! $_->has_default && ! $_->has_builder } @attrs ; my @tc = map { q{'} . $_->init_arg . q{' => '} . $_->type_constraint->name . q{',} } grep { $_->has_type_constraint } @attrs; my @coerce = map { "'" . $_->init_arg . "' => 1," } grep { $_->should_coerce } @attrs ; $source .= <<"EOF"; my \$all_errors = MooseX::Constructor::AllErrors::Error::Constructor->new( caller => [caller(1)], ); my \%required_attrs = (@required); for my \$required_attr (keys \%required_attrs) { next if exists \$params->{\$required_attr}; \$all_errors->add_error( MooseX::Constructor::AllErrors::Error::Required->new( attribute => Moose::Util::find_meta(\$instance)->get_attribute(\$required_attr) ) ); } my \%tc_attrs = (@tc); my \%should_coerce = (@coerce); for my \$tc_attr (keys \%tc_attrs) { next unless exists \$params->{\$tc_attr}; my \$tc = Moose::Util::TypeConstraints::find_type_constraint(\$tc_attrs{\$tc_attr}); my \$value = \$tc->has_coercion && \$should_coerce{\$tc_attr} ? \$tc->coerce(\$params->{\$tc_attr}) : \$params->{\$tc_attr}; next if \$tc->check(\$value); \$all_errors->add_error( MooseX::Constructor::AllErrors::Error::TypeConstraint->new( attribute => Moose::Util::find_meta(\$instance)->get_attribute(\$tc_attr), data => \$value, ) ); } if (\$all_errors->has_errors) { Moose::Util::find_meta(\$instance)->throw_error( \$all_errors, params => \$params, ); } EOF return $source; }; no Moose::Role; 1;