0eca21c66be0dd2e576799f36ae69ae6819d5fee
[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_set_member action_for_remove_member
12   ) ]
13 );
14
15 has members => (is => 'ro', required => 1);
16
17 sub get_member_at {
18   my ($self, $at) = @_;
19   $self->members->{ref($at) ? $at->string_value : $at};
20 }
21
22 sub with_member_at {
23   my ($self, $at, $value) = @_;
24   $self->but(
25     members => {
26       %{$self->members},
27       (ref($at) ? $at->string_value : $at) => $value
28     }
29   );
30 }
31
32 sub without_member_at {
33   my ($self, $at) = @_;
34   my %members = %{$self->members};
35   delete $members{$at};
36   $self->but(members => \%members);
37 }
38
39 1;