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.pm58
1 files changed, 45 insertions, 13 deletions
diff --git a/lib/Data/MultiValued/UglySerializationHelperRole.pm b/lib/Data/MultiValued/UglySerializationHelperRole.pm
index ebf783a..db5a4d8 100644
--- a/lib/Data/MultiValued/UglySerializationHelperRole.pm
+++ b/lib/Data/MultiValued/UglySerializationHelperRole.pm
@@ -60,10 +60,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;
}
@@ -85,20 +83,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} ];
+}
+}
+
=head1 FINAL WARNING
my $obj_clone = My::Class->new_in_place($obj->as_hash);