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