1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
use strict;
use warnings;
package MetaCPAN::Client::Role::Entity;
# ABSTRACT: A role for MetaCPAN entities
$MetaCPAN::Client::Role::Entity::VERSION = '2.033000';
use Moo::Role;
use JSON::PP;
use Ref::Util qw< is_ref is_arrayref is_hashref >;
has data => (
is => 'ro',
required => 1,
);
has client => (
is => 'ro',
lazy => 1,
builder => '_build_client',
);
sub _build_client {
require MetaCPAN::Client;
return MetaCPAN::Client->new();
}
sub BUILDARGS {
my ( $class, %args ) = @_;
my $known_fields = $class->_known_fields;
for my $k ( @{ $known_fields->{scalar} } ) {
$args{data}{$k} = $args{data}{$k}->[0]
if is_arrayref( $args{data}{$k} ) and @{$args{data}{$k}} == 1;
if ( JSON::PP::is_bool($args{data}{$k}) ) {
$args{data}{$k} = !!$args{data}{$k};
}
elsif ( is_ref( $args{data}{$k} ) ) {
delete $args{data}{$k};
}
}
for my $k ( @{ $known_fields->{arrayref} } ) {
# fix the case when we expect an array ref but get a scalar because
# the result array had one element and we received a scalar
if ( defined($args{data}{$k}) and !is_ref($args{data}{$k}) ) {
$args{data}{$k} = [ $args{data}{$k} ]
}
delete $args{data}{$k}
unless is_arrayref( $args{data}{$k} ); # warn?
}
for my $k ( @{ $known_fields->{hashref} } ) {
delete $args{data}{$k}
unless is_hashref( $args{data}{$k} ); # warn?
}
return \%args;
}
sub new_from_request {
my ( $class, $request, $client ) = @_;
my $known_fields = $class->_known_fields;
return $class->new(
( defined $client ? ( client => $client ) : () ),
data => {
map +( defined $request->{$_} ? ( $_ => $request->{$_} ) : () ),
map +( @{ $known_fields->{$_} } ),
qw< scalar arrayref hashref >
}
);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
MetaCPAN::Client::Role::Entity - A role for MetaCPAN entities
=head1 VERSION
version 2.033000
=head1 DESCRIPTION
This is a role to be consumed by all L<MetaCPAN::Client> entities. It provides
common attributes and methods.
=head1 ATTRIBUTES
=head2 data
Hash reference containing all the entity data.
Entities are usually generated using C<new_from_request> which sets the C<data>
attribute appropriately by picking the relevant information.
Required.
=head1 METHODS
=head2 new_from_request
Create a new entity object using a request hash. The hash represents the
information returned from a MetaCPAN request. This also sets the data attribute.
=head2 BUILDARGS
Perform type checks & conversion for the incoming data.
=head1 AUTHORS
=over 4
=item *
Sawyer X <xsawyerx@cpan.org>
=item *
Mickey Nasriachi <mickey@cpan.org>
=back
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Sawyer X.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|