0ac25b7f8579ae9c7607ec5d00e6dc895227ee36
[scpubgit/DX.git] / lib / DX / ActionBuilder / Null.pm
1 package DX::ActionBuilder::Null;
2
3 use DX::Class;
4
5 with 'DX::Role::ActionBuilder';
6
7 has target_path => (is => 'ro');
8
9 sub can_set_value { 0 }
10
11 sub action_for_set_value { undef }
12
13 sub action_for_add_member { undef }
14
15 sub action_for_set_member { undef }
16
17 sub action_for_remove_member { undef }
18
19 sub specialize_for_member {
20   my ($self, $at) = @_;
21   return $self unless ref($self);
22   return $self unless my $path = $self->target_path;
23   return $self->but(
24     target_path => [ @{$self->target_path}, $at ]
25   );
26 }
27
28 sub apply_to_value {
29   my ($self, $value) = @_;
30   my $new_value = $value->but_set_action_builder($self)
31                         ->but_set_identity_path($self->target_path);
32   return $new_value unless $new_value->isa('DX::Value::Dict');
33   my %m = %{$new_value->members};
34   return $new_value->but(
35     members => {
36       map +($_ => $self->specialize_for_member($_)->apply_to_value($m{$_})),
37         keys %m,
38     },
39   );
40 }
41
42 1;