summaryrefslogtreecommitdiff
path: root/lib/Data/MultiValued/TagContainerForRanges.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Data/MultiValued/TagContainerForRanges.pm')
-rw-r--r--lib/Data/MultiValued/TagContainerForRanges.pm80
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/Data/MultiValued/TagContainerForRanges.pm b/lib/Data/MultiValued/TagContainerForRanges.pm
new file mode 100644
index 0000000..8e3c2b9
--- /dev/null
+++ b/lib/Data/MultiValued/TagContainerForRanges.pm
@@ -0,0 +1,80 @@
+package Data::MultiValued::TagContainerForRanges;
+use Moose;
+use MooseX::Types::Moose qw(HashRef);
+use Moose::Util::TypeConstraints;
+use Data::MultiValued::RangeContainer;
+
+# ABSTRACT: container for tagged values that are ranged containers
+
+=head1 DESCRIPTION
+
+Please don't use this module directly, use
+L<Data::MultiValued::TagsAndRanges>.
+
+This module is a subclass of L<Data::MultiValued::TagContainer>, which
+only allows instances of L<Data::MultiValued::RangeContainer> as
+"storage cells".
+
+=cut
+
+extends 'Data::MultiValued::TagContainer';
+
+has '+_storage' => (
+ isa => HashRef[class_type('Data::MultiValued::RangeContainer')],
+);
+
+has '+_default_tag' => (
+ isa => class_type('Data::MultiValued::RangeContainer'),
+);
+
+=method C<_create_new_inferior>
+
+Returns a new L<Data::MultiValued::RangeContainer> instance.
+
+=cut
+
+sub _create_new_inferior {
+ Data::MultiValued::RangeContainer->new();
+}
+
+=head1 Serialisation helpers
+
+These are used through
+L<Data::MultiValued::UglySerializationHelperRole>.
+
+=head2 C<_rebless_storage>
+
+Blesses the "storage cells" into L<Data::MultiValued::RangeContainer>.
+
+=cut
+
+sub _rebless_storage {
+ my ($self) = @_;
+ bless $_,'Data::MultiValued::RangeContainer'
+ for values %{$self->{_storage}};
+ bless $self->{_default_tag},'Data::MultiValued::RangeContainer';
+ return;
+}
+
+=head2 C<_as_hash>
+
+Returns the internal representation with no blessed hashes, with as
+few copies as possible.
+
+=cut
+
+sub _as_hash {
+ my ($self) = @_;
+ my %st;
+ for my $k (keys %{$self->_storage}) {
+ my %v = %{$self->_storage->{$k}};
+ $st{$k}=\%v;
+ }
+ my %dt = %{$self->_default_tag};
+ return {
+ _storage => \%st,
+ _default_tag => \%dt,
+ };
+}
+
+1;