summaryrefslogtreecommitdiff
path: root/lib/Data/MultiValued/UglySerializationHelperRole.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Data/MultiValued/UglySerializationHelperRole.pm')
-rw-r--r--lib/Data/MultiValued/UglySerializationHelperRole.pm62
1 files changed, 47 insertions, 15 deletions
diff --git a/lib/Data/MultiValued/UglySerializationHelperRole.pm b/lib/Data/MultiValued/UglySerializationHelperRole.pm
index 9913a7d..2ebe831 100644
--- a/lib/Data/MultiValued/UglySerializationHelperRole.pm
+++ b/lib/Data/MultiValued/UglySerializationHelperRole.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::UglySerializationHelperRole;
{
- $Data::MultiValued::UglySerializationHelperRole::VERSION = '0.0.3';
+ $Data::MultiValued::UglySerializationHelperRole::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::UglySerializationHelperRole::DIST = 'Data-MultiValued';
@@ -16,10 +16,8 @@ sub new_in_place {
my $self = bless $hash,$class;
- for my $attr ($class->meta->get_all_attributes) {
- if ($attr->does('Data::MultiValued::AttributeTrait')) {
- $attr->_rebless_slot($self);
- }
+ for my $attr (@{$class->_dmv_multi_attrs}) {
+ $attr->_rebless_slot($self);
}
return $self;
}
@@ -29,20 +27,54 @@ sub as_hash {
my ($self) = @_;
my %ret = %$self;
- for my $attr ($self->meta->get_all_attributes) {
- if ($attr->does('Data::MultiValued::AttributeTrait')) {
- my $st = $attr->_as_hash($self);
- if ($st) {
- $ret{$attr->full_storage_slot} = $st;
- }
- else {
- delete $ret{$attr->full_storage_slot};
- }
+ for my $attr (@{$self->_dmv_multi_attrs}) {
+ my $st = $attr->_as_hash($self);
+ if ($st) {
+ $ret{$attr->full_storage_slot} = $st;
+ }
+ else {
+ delete $ret{$attr->full_storage_slot};
}
}
return \%ret;
}
+{
+my (
+ %all_attrs_for_class,
+ %tagged_attrs_for_class,
+ %ranged_attrs_for_class,
+ %multi_attrs_for_class,
+);
+
+sub _dmv_all_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $all_attrs_for_class{$class} //= [$class->meta->get_all_attributes];
+}
+sub _dmv_tagged_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $tagged_attrs_for_class{$class} //=
+ [ grep { $_->does('Data::MultiValued::AttributeTrait::Tags') }
+ @{$class->_dmv_all_attrs} ];
+}
+sub _dmv_ranged_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $ranged_attrs_for_class{$class} //=
+ [ grep { $_->does('Data::MultiValued::AttributeTrait::Ranges') }
+ @{$class->_dmv_all_attrs} ];
+}
+sub _dmv_multi_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $multi_attrs_for_class{$class} //=
+ [ grep { $_->does('Data::MultiValued::AttributeTrait') }
+ @{$class->_dmv_all_attrs} ];
+}
+}
+
1;
@@ -57,7 +89,7 @@ Data::MultiValued::UglySerializationHelperRole - only use this if you know what
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS