package Data::MultiValued::UglySerializationHelperRole;
use Moose::Role;
use namespace::autoclean;
sub new_in_place {
my ($class,$hash) = @_;
my $self = bless $hash,$class;
for my $attr (@{$class->_dmv_multi_attrs}) {
$attr->_rebless_slot($self);
}
return $self;
}
sub as_hash {
my ($self) = @_;
my %ret = %$self;
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;