value_path will work fine for new-value binding, identity_path not required
[scpubgit/DX.git] / lib / DX / Predicate / MemberAt.pm
index b3120a2..bde4bf1 100644 (file)
@@ -2,6 +2,7 @@ package DX::Predicate::MemberAt;
 
 use DX::Utils qw(step INDICES_OF EXISTENCE_OF CONTENTS_OF string);
 use DX::ActionBuilder::ProxySetToAdd;
+use DX::ActionBuilder::Null;
 use DX::Class;
 
 with 'DX::Role::Predicate';
@@ -36,7 +37,7 @@ sub _possible_resolution_list {
           } elsif (
             !$value->is_set
             and $value->action_builder->isa('DX::ActionBuilder::UnsetValue')
-            and my $p = $coll->identity_path
+            and my $p = $coll->value_path
           ) {
             my @path = (@$p, $key->string_value);
             my $ab = DX::ActionBuilder::ProxySetToAdd->new(
@@ -45,7 +46,6 @@ sub _possible_resolution_list {
             );
             my $set = $value->action_for_set_value(
                         $value->but(
-                          identity_path => \@path,
                           action_builder => $ab
                         )
                       );
@@ -64,9 +64,15 @@ sub _possible_resolution_list {
         }
       : ()
     ),
-    ($key->can_set_value
+    (!$key->is_set
+     && $key->action_builder->isa('DX::ActionBuilder::UnsetValue')
       ? map {
-          my $set_key = $key->action_for_set_value(string(my $kstr = $_));
+          my $set_key = DX::Action::SetValue->new(
+            target_path => $key->action_builder->target_path,
+            new_value => DX::ActionBuilder::Null->new(
+                           target_path => $key->action_builder->target_path,
+                         )->apply_to_value(string(my $kstr = $_))
+          );
           map $_->but_first($set_key)
                 ->but_with_dependencies_on(
                     [ undef ,=>