package Data::TagsAndRanges::TagContainer;
use Moose;
use Moose::Util::TypeConstraints;
use MooseX::Types::Moose qw(HashRef);
use Data::TagsAndRanges::Exceptions;
use Data::TagsAndRanges::RangeContainer;
has _storage => (
is => 'rw',
isa => HashRef[class_type('Data::TagsAndRanges::RangeContainer')],
init_arg => undef,
default => sub { { } },
traits => ['Hash'],
handles => {
_has_tag => 'exists',
_get_tag => 'get',
_create_tag => 'set',
},
);
has _default_range => (
is => 'rw',
isa => class_type('Data::TagsAndRanges::RangeContainer'),
init_arg => undef,
predicate => '_has_default_range',
);
sub get {
my ($self,$args) = @_;
my $tag = $args->{tag};
if (!defined($tag)) {
if ($self->_has_default_range) {
return $self->_default_range;
}
Data::TagsAndRanges::Exceptions::TagNotFound->throw({
value => $tag,
});
}
if (!$self->_has_tag($tag)) {
Data::TagsAndRanges::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_range) {
return $self->_default_range;
}
else {
return $self->_default_range(
Data::TagsAndRanges::RangeContainer->new()
);
}
}
if (!$self->_has_tag($tag)) {
$self->_create_tag($tag,Data::TagsAndRanges::RangeContainer->new());
}
return $self->_get_tag($tag);
}
1;