pervasive type constraints
[scpubgit/DX.git] / lib / DX / ActionBuilder / Null.pm
CommitLineData
9d759b64 1package DX::ActionBuilder::Null;
2
3use DX::Class;
4
5with 'DX::Role::ActionBuilder';
6
2548ce61 7has target_path => (is => 'ro', isa => ValuePath);
e1bcd735 8
9d759b64 9sub can_set_value { 0 }
10
6aa36401 11sub aperture_for_set_value { [] }
12
9d759b64 13sub action_for_set_value { undef }
14
1f3fa757 15sub can_add_member { 0 }
16
6aa36401 17sub aperture_for_add_member { [] }
18
9d759b64 19sub action_for_add_member { undef }
20
6aa36401 21sub aperure_for_set_member { [] }
22
9d759b64 23sub action_for_set_member { undef }
24
6aa36401 25sub aperture_for_remove_member { [] }
26
9d759b64 27sub action_for_remove_member { undef }
28
345270ac 29sub specialize_for_member {
30 my ($self, $at) = @_;
31 return $self unless ref($self);
32 return $self unless my $path = $self->target_path;
33 return $self->but(
34 target_path => [ @{$self->target_path}, $at ]
35 );
36}
37
38sub apply_to_value {
39 my ($self, $value) = @_;
7a5595d3 40 my $new_value = $value->but_set_action_builder($self);
345270ac 41 return $new_value unless $new_value->isa('DX::Value::Dict');
42 my %m = %{$new_value->members};
43 return $new_value->but(
44 members => {
45 map +($_ => $self->specialize_for_member($_)->apply_to_value($m{$_})),
46 keys %m,
47 },
48 );
49}
9d759b64 50
511;