move the error to the action
[catagits/Reaction.git] / lib / Reaction / InterfaceModel / Action.pm
index c4e4cae..06ab55a 100644 (file)
@@ -8,6 +8,11 @@ use Reaction::Class;
 
 use namespace::clean -except => [ qw(meta) ];
 
+has error_message => (
+  is => 'rw',
+  isa => 'Str',
+  metaclass => 'Reaction::Meta::Attribute'
+);
 has target_model => (
   is => 'ro',
   required => 1,
@@ -18,7 +23,8 @@ has ctx => (
   isa => 'Catalyst',
   is => 'ro',
   lazy_fail => 1,
-  metaclass => 'Reaction::Meta::Attribute'
+  metaclass => 'Reaction::Meta::Attribute',
+  weak_ref => 1,
 );
 
 sub parameter_attributes {
@@ -31,7 +37,8 @@ sub parameter_hashref {
   foreach my $attr ($self->parameter_attributes) {
     my $reader = $attr->get_read_method;
     my $predicate = $attr->get_predicate_method;
-    next if defined($predicate) && !$self->$predicate;
+    next if defined($predicate) && !$self->$predicate
+         && ($attr->is_lazy_fail || !$attr->has_default);
     $params{$attr->name} = $self->$reader;
   }
   return \%params;
@@ -44,7 +51,7 @@ sub can_apply {
     if ($self->attribute_is_required($attr)) {
       confess "No predicate for required attribute ${\$attr->name} for ${self}"
         unless $predicate;
-      return 0 unless $self->$predicate;
+      return 0 if !$self->$predicate && ($attr->is_lazy_fail || !$attr->has_default);
     }
     if ($attr->has_valid_values) {
       unless ($predicate && !($self->$predicate)) {