44cc0ab3960f1edbeec854cbaaaad9daeb39d4dd
[scpubgit/DX.git] / lib / DX / Value / Dict.pm
1 package DX::Value::Dict;
2
3 use DX::Utils qw(string);
4 use DX::Class;
5
6 with 'DX::Role::StructuredValue';
7
8 has '+action_builder' => (
9   handles => [ qw(
10     can_set_value action_for_set_value
11     action_for_add_member action_for_remove_member
12   ) ]
13 );
14
15 has members => (is => 'ro', required => 1);
16
17 sub index_list { sort keys %{$_[0]->members} }
18
19 sub get_member_at {
20   my ($self, $at) = @_;
21   $self->members->{ref($at) ? $at->string_value : $at};
22 }
23
24 sub with_member_at {
25   my ($self, $at, $value) = @_;
26   $self->but(
27     members => {
28       %{$self->members},
29       (ref($at) ? $at->string_value : $at) => $value
30     }
31   );
32 }
33
34 sub without_member_at {
35   my ($self, $at) = @_;
36   my %members = %{$self->members};
37   delete $members{$at};
38   $self->but(members => \%members);
39 }
40
41 sub to_data {
42   my ($self) = @_;
43   my $m = $self->members;
44   +{ map +($_ => $m->{$_}->to_data), $self->index_list };
45 }
46
47 sub but_set_identity_path {
48   my ($self, $path) = @_;
49   my $m = $self->members;
50   $self->but(
51     identity_path => $path,
52     members => +{
53       map +($_ => $m->{$_}->but_set_identity_path([ @$path, $_ ])),
54         keys %$m
55     },
56   );
57 }
58
59 1;