1 package Reaction::InterfaceModel::Action;
3 use Reaction::Meta::InterfaceModel::Action::Class;
4 use metaclass 'Reaction::Meta::InterfaceModel::Action::Class';
6 use Reaction::Meta::Attribute;
9 use namespace::clean -except => [ qw(meta) ];
11 has error_message => (
14 metaclass => 'Reaction::Meta::Attribute'
19 metaclass => 'Reaction::Meta::Attribute'
26 metaclass => 'Reaction::Meta::Attribute',
30 sub parameter_attributes {
31 shift->meta->parameter_attributes;
34 sub parameter_hashref {
37 foreach my $attr ($self->parameter_attributes) {
38 my $reader = $attr->get_read_method;
39 my $predicate = $attr->get_predicate_method;
40 next if defined($predicate) && !$self->$predicate
41 && ($attr->is_lazy_fail || !$attr->has_default);
42 $params{$attr->name} = $self->$reader;
49 foreach my $attr ($self->parameter_attributes) {
50 my $predicate = $attr->get_predicate_method;
51 if ($self->attribute_is_required($attr)) {
52 confess "No predicate for required attribute ${\$attr->name} for ${self}"
54 return 0 if !$self->$predicate && ($attr->is_lazy_fail || !$attr->has_default);
56 if ($attr->has_valid_values) {
57 unless ($predicate && !($self->$predicate)) {
58 my $reader = $attr->get_read_method;
59 return 0 unless $attr->check_valid_value($self, $self->$reader);
66 my ($self, $attr) = @_;
67 confess "No attribute passed to error_for" unless defined($attr);
69 my $meta = $self->meta->find_attribute_by_name($attr);
70 confess "Can't find attribute ${attr} on $self" unless $meta;
73 return $self->error_for_attribute($attr);
75 sub error_for_attribute {
76 my ($self, $attr) = @_;
77 my $reader = $attr->get_read_method;
78 my $predicate = $attr->get_predicate_method;
79 if ($self->attribute_is_required($attr)) {
80 unless ($self->$predicate) {
81 return $attr->name." is required";
84 if ($self->$predicate && $attr->has_valid_values) {
85 unless ($attr->check_valid_value($self, $self->$reader)) {
86 return "Not a valid value for ".$attr->name;
91 sub attribute_is_required {
92 my ($self, $attr) = @_;
93 return $attr->is_required;
98 __PACKAGE__->meta->make_immutable;
105 Reaction::InterfaceModel::Action
115 =head2 parameter_attributes
119 L<Reaction::Meta::Attribute>
123 See L<Reaction::Class> for authors.
127 See L<Reaction::Class> for the license.