summaryrefslogtreecommitdiff
path: root/Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm')
-rw-r--r--Data-TagsAndRanges/lib/Data/TagsAndRanges/TagContainer.pm73
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;