provide and preserve aperture information
[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
e1bcd735 9around target_path => sub {
10 my ($orig, $self) = (shift, shift);
11 return undef unless ref($self);
12 return $self->$orig(@_);
13};
14
9d759b64 15sub can_set_value { 0 }
16
6aa36401 17sub aperture_for_set_value { [] }
18
9d759b64 19sub action_for_set_value { undef }
20
1f3fa757 21sub can_add_member { 0 }
22
6aa36401 23sub aperture_for_add_member { [] }
24
9d759b64 25sub action_for_add_member { undef }
26
6aa36401 27sub aperure_for_set_member { [] }
28
9d759b64 29sub action_for_set_member { undef }
30
6aa36401 31sub aperture_for_remove_member { [] }
32
9d759b64 33sub action_for_remove_member { undef }
34
345270ac 35sub specialize_for_member {
36 my ($self, $at) = @_;
37 return $self unless ref($self);
38 return $self unless my $path = $self->target_path;
39 return $self->but(
40 target_path => [ @{$self->target_path}, $at ]
41 );
42}
43
44sub apply_to_value {
45 my ($self, $value) = @_;
7a5595d3 46 my $new_value = $value->but_set_action_builder($self);
345270ac 47 return $new_value unless $new_value->isa('DX::Value::Dict');
48 my %m = %{$new_value->members};
49 return $new_value->but(
50 members => {
51 map +($_ => $self->specialize_for_member($_)->apply_to_value($m{$_})),
52 keys %m,
53 },
54 );
55}
9d759b64 56
571;