Commit | Line | Data |
9d759b64 |
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 |
1f3fa757 |
11 | can_add_member action_for_add_member action_for_remove_member |
9d759b64 |
12 | ) ] |
13 | ); |
14 | |
2548ce61 |
15 | has members => (is => 'ro', required => 1, isa => HashRef[Value]); |
9d759b64 |
16 | |
c25fbf05 |
17 | sub for_deparse { |
18 | [ dict => $_[0]->members ] |
19 | } |
20 | |
1e812b19 |
21 | sub index_list { sort keys %{$_[0]->members} } |
22 | |
9d759b64 |
23 | sub get_member_at { |
24 | my ($self, $at) = @_; |
efad53c4 |
25 | $self->members->{ref($at) ? $at->string_value : $at}; |
9d759b64 |
26 | } |
27 | |
28 | sub 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 | |
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 | |
9e13b86b |
45 | sub to_data { |
46 | my ($self) = @_; |
47 | my $m = $self->members; |
48 | +{ map +($_ => $m->{$_}->to_data), $self->index_list }; |
49 | } |
50 | |
9d759b64 |
51 | 1; |