pervasive type constraints
[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     can_add_member action_for_add_member action_for_remove_member
12   ) ]
13 );
14
15 has members => (is => 'ro', required => 1, isa => HashRef[Value]);
16
17 sub for_deparse {
18   [ dict => $_[0]->members ]
19 }
20
21 sub index_list { sort keys %{$_[0]->members} }
22
23 sub get_member_at {
24   my ($self, $at) = @_;
25   $self->members->{ref($at) ? $at->string_value : $at};
26 }
27
28 sub with_member_at {
29   my ($self, $at, $value) = @_;
30   $self->but(
31     members => {
32       %{$self->members},
33       (ref($at) ? $at->string_value : $at) => $value
34     }
35   );
36 }
37
38 sub without_member_at {
39   my ($self, $at) = @_;
40   my %members = %{$self->members};
41   delete $members{$at};
42   $self->but(members => \%members);
43 }
44
45 sub to_data {
46   my ($self) = @_;
47   my $m = $self->members;
48   +{ map +($_ => $m->{$_}->to_data), $self->index_list };
49 }
50
51 1;