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 sub _debug { $ENV{REACTION_IM_ACTION_DEBUG} }
13 has error_message => (
16 metaclass => 'Reaction::Meta::Attribute'
21 metaclass => 'Reaction::Meta::Attribute'
28 metaclass => 'Reaction::Meta::Attribute',
32 sub parameter_attributes {
33 shift->meta->parameter_attributes;
36 sub parameter_hashref {
39 foreach my $attr ($self->parameter_attributes) {
40 my $reader = $attr->get_read_method;
41 my $predicate = $attr->get_predicate_method;
42 warn "${\$attr->name} has default: ${\$attr->has_default}" if _debug();
43 next if defined($predicate) && !$self->$predicate
44 && ($attr->is_lazy_fail || !$attr->has_default);
45 $params{$attr->name} = $self->$reader;
52 foreach my $attr ($self->parameter_attributes) {
53 my $predicate = $attr->get_predicate_method;
54 if ($self->attribute_is_required($attr)) {
55 confess "No predicate for required attribute ${\$attr->name} for ${self}"
57 if( !$self->$predicate && ($attr->is_lazy_fail || !$attr->has_default) ) {
58 warn "${\$attr->name} is required but hasn't been set" if _debug();
62 if ($attr->has_valid_values) {
63 unless ($predicate && !($self->$predicate)) {
64 my $reader = $attr->get_read_method;
65 unless( $attr->check_valid_value($self, $self->$reader) ) {
66 warn "\${\$self->$reader} isn't a valid value for ${\$attr->name}" if _debug();
75 my ($self, $attr) = @_;
76 confess "No attribute passed to error_for" unless defined($attr);
78 my $meta = $self->meta->find_attribute_by_name($attr);
79 confess "Can't find attribute ${attr} on $self" unless $meta;
82 return $self->error_for_attribute($attr);
84 sub error_for_attribute {
85 my ($self, $attr) = @_;
86 my $reader = $attr->get_read_method;
87 my $predicate = $attr->get_predicate_method;
88 if ($self->attribute_is_required($attr)) {
89 unless ($self->$predicate) {
90 return $attr->name." is required";
93 if ($self->$predicate && $attr->has_valid_values) {
94 unless ($attr->check_valid_value($self, $self->$reader)) {
95 return "Not a valid value for ".$attr->name;
100 sub attribute_is_required {
101 my ($self, $attr) = @_;
102 return $attr->is_required;
107 __PACKAGE__->meta->make_immutable;
114 Reaction::InterfaceModel::Action
124 =head2 parameter_attributes
128 L<Reaction::Meta::Attribute>
132 See L<Reaction::Class> for authors.
136 See L<Reaction::Class> for the license.