Commit | Line | Data |
1e90aa03 |
1 | package DX::ActionBuilder::BoundValue; |
2 | |
3 | use DX::Action::SetBoundValue; |
4 | #use DX::Action::AddBoundValue; |
5 | use DX::Class; |
6 | |
7 | with 'DX::Role::ActionBuilder'; |
8 | |
9 | has target_path => (is => 'ro', required => 1); |
10 | |
11 | has rebind_path => (is => 'ro', required => 1); |
12 | |
13 | has bound_to_path => (is => 'ro', required => 1); |
14 | |
15 | has inner_action_builder => (is => 'ro', required => 1); |
16 | |
17 | sub 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 |
30 | sub 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 |
50 | 1; |