summaryrefslogtreecommitdiff
path: root/lib/Data/MultiValued/TagContainer.pm
blob: cdd0456464d04f7f4e592e2fac941119a15af396 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package Data::MultiValued::TagContainer; 
use Moose;
use Moose::Util::TypeConstraints;
use MooseX::Types::Moose qw(HashRef);
use Data::MultiValued::Exceptions;
 
has _storage => (
    is => 'rw',
    isa => HashRef,
    init_arg => undef,
    default => sub { { } },
    traits => ['Hash'],
    handles => {
        _has_tag => 'exists',
        _get_tag => 'get',
        _create_tag => 'set',
        _delete_tag => 'delete',
    },
);
 
has _default_tag => (
    is => 'rw',
    init_arg => undef,
    predicate => '_has_default_tag',
    clearer => '_clear_default_tag',
);
 
sub get {
    my ($self,$args) = @_;
 
    my $tag = $args->{tag};
 
    if (!defined($tag)) {
        if ($self->_has_default_tag) {
            return $self->_default_tag;
        }
 
        Data::MultiValued::Exceptions::TagNotFound->throw({
            value => $tag,
        });
    }
 
    if (!$self->_has_tag($tag)) {
        Data::MultiValued::Exceptions::TagNotFound->throw({
            value => $tag,
        });
    }
    return $self->_get_tag($tag);
}
 
sub get_or_create {
    my ($self,$args) = @_;
 
    my $tag = $args->{tag};
 
    if (!defined($tag)) {
        if ($self->_has_default_tag) {
            return $self->_default_tag;
        }
        else {
            return $self->_default_tag(
                $self->_create_new_inferior
            );
        }
    }
 
    if (!$self->_has_tag($tag)) {
        $self->_create_tag($tag,$self->_create_new_inferior);
    }
    return $self->_get_tag($tag);
}
 
sub _clear_storage {
    my ($self) = @_;
 
    $self->_storage({});
}
 
sub clear {
    my ($self,$args) = @_;
 
    my $tag = $args->{tag};
 
    if (!defined($tag)) {
        $self->_clear_default_tag;
        $self->_clear_storage;
    }
    elsif ($self->_has_tag($tag)) {
        $self->_delete_tag($tag);
    }
    return;
}
 
sub _create_new_inferior {
    my ($self) = @_;
    return {};
}
 
1;