diff options
Diffstat (limited to 'lib/Data/MultiValued/UglySerializationHelperRole.pm')
-rw-r--r-- | lib/Data/MultiValued/UglySerializationHelperRole.pm | 62 |
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 |