refactor action stuff to be recursive on dicts
[scpubgit/DX.git] / lib / DX / ActionBuilder / BoundValue.pm
CommitLineData
1e90aa03 1package DX::ActionBuilder::BoundValue;
2
3use DX::Action::SetBoundValue;
4#use DX::Action::AddBoundValue;
5use DX::Class;
6
7with 'DX::Role::ActionBuilder';
8
9has target_path => (is => 'ro', required => 1);
10
11has rebind_path => (is => 'ro', required => 1);
12
13has bound_to_path => (is => 'ro', required => 1);
14
15has inner_action_builder => (is => 'ro', required => 1);
16
17sub action_for_set_value {
18 my ($self, $value) = @_;
19 my $inner_action = $self->inner_action_builder->action_for_set_value($value);
20 return undef unless $inner_action;
21 DX::Action::SetBoundValue->new(
22 target_path => $self->target_path,
3a630a54 23 bound_to_path => $self->bound_to_path,
1e90aa03 24 rebind_path => $self->rebind_path,
3a630a54 25 new_value => $value,
1e90aa03 26 inner_action => $inner_action,
27 )
28}
29
3a630a54 30sub apply_to_value {
31 my ($self, $value, $inner_value) = @_;
32 my $new_value = $value->but_set_action_builder($self)
33 ->but_set_identity_path($inner_value->identity_path);
34 return $new_value unless $new_value->isa('DX::Value::Dict');
35 my %m = %{$new_value->members};
36 return $new_value->but(
37 members => {
38 map {
39 my $this_inner = $inner_value->get_member_at($_);
40 ($_ => $self->but(
41 target_path => [ @{$self->target_path}, $_ ],
42 bound_to_path => [ @{$self->bound_to_path}, $_ ],
43 inner_action_builder => $this_inner->action_builder,
44 )->apply_to_value($m{$_}, $this_inner))
45 } keys %m
46 },
47 );
48}
49
1e90aa03 501;