package Data::MultiValued::TagsAndRanges; use Moose; use namespace::autoclean; use MooseX::Params::Validate; use Moose::Util::TypeConstraints; use Data::MultiValued::Exceptions; use Data::MultiValued::TagContainerForRanges; # ABSTRACT: Handle values with tags and validity ranges =head1 SYNOPSIS use Data::MultiValued::TagsAndRanges; my $obj = Data::MultiValued::TagsAndRanges->new(); $obj->set({ tag => 'tag1', from => 10, to => 20, value => 'foo', }); say $obj->get({tag => 'tag1', at => 15}); # prints 'foo' say $obj->get({tag => 'tag1', at => 35}); # dies say $obj->get({tag => 'tag2', at => 15}); # dies =cut has _storage => ( is => 'rw', isa => class_type('Data::MultiValued::TagContainerForRanges'), init_arg => undef, lazy_build => 1, ); sub _build__storage { Data::MultiValued::TagContainerForRanges->new(); } =method C $obj->set({ tag => $the_tag, from => $min, to => $max, value => $the_value }); Stores the given value for the given tag and range. Does not throw exceptions. See L and L for more details. =cut sub set { my ($self,%args) = validated_hash( \@_, from => { isa => 'Num|Undef', optional => 1, }, to => { isa => 'Num|Undef', optional => 1, }, tag => { isa => 'Maybe[Str]', optional => 1, }, value => { isa => 'Any', }, ); $self->_storage->get_or_create(\%args) ->get_or_create(\%args) ->{value} = $args{value}; } =method C my $value = $obj->get({ tag => $the_tag, at => $point }); Retrieves the value for the given tag and point. Throws a L exception if no ranges exist in this object that include the point, and L exception if the tag does not exists in this object. See L and L for more details. =cut sub get { my ($self,%args) = validated_hash( \@_, at => { isa => 'Num|Undef', optional => 1, }, tag => { isa => 'Maybe[Str]', optional => 1, }, ); $self->_storage->get(\%args) ->get(\%args) ->{value}; } =method C $obj->clear({ tag => $the_tag, from => $min, to => $max }); If a range is specified, deletes all values for the given range and tag. If no range is specified, delete all values for the given tag. Does not throw exceptions. See L and L for more details. =cut sub clear { my ($self,%args) = validated_hash( \@_, from => { isa => 'Num|Undef', optional => 1, }, to => { isa => 'Num|Undef', optional => 1, }, tag => { isa => 'Maybe[Str]', optional => 1, }, ); if (exists $args{from} || exists $args{to}) { $self->_storage->get(\%args) ->clear(\%args); } else { $self->_storage->clear(\%args); } } =head1 Serialisation helpers These are used through L. =head2 C<_rebless_storage> Blesses the storage into L, then calls C<_rebless_storage> on it. =cut sub _rebless_storage { my ($self) = @_; bless $self->{_storage},'Data::MultiValued::TagContainerForRanges'; $self->_storage->_rebless_storage; } =head2 C<_as_hash> Returns the internal representation with no blessed hashes, with as few copies as possible. Depends on L. =cut sub _as_hash { my ($self) = @_; my $ret = $self->_storage->_as_hash; return {_storage=>$ret}; } __PACKAGE__->meta->make_immutable(); 1;