diff options
Diffstat (limited to 'Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm')
-rw-r--r-- | Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm b/Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm new file mode 100644 index 0000000..c820f9a --- /dev/null +++ b/Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm @@ -0,0 +1,73 @@ +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; |