add value_path method and give action builders a path
[scpubgit/DX.git] / lib / DX / ActionBuilder / Null.pm
CommitLineData
9d759b64 1package DX::ActionBuilder::Null;
2
3use DX::Class;
4
5with 'DX::Role::ActionBuilder';
6
345270ac 7has target_path => (is => 'ro');
4aeeab1e 8
9d759b64 9sub can_set_value { 0 }
10
11sub action_for_set_value { undef }
12
13sub action_for_add_member { undef }
14
15sub action_for_set_member { undef }
16
17sub action_for_remove_member { undef }
18
345270ac 19sub 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
28sub 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}
9d759b64 41
421;