File Coverage

blib/lib/API/Instagram/Media.pm
Criterion Covered Total %
statement 71 71 100.0
branch 13 14 92.8
condition n/a
subroutine 28 28 100.0
pod 9 9 100.0
total 121 122 99.1


line stmt bran cond sub pod time code
1             package API::Instagram::Media;
2              
3             # ABSTRACT: Instagram Media Object
4              
5 15     15   111 use Moo;
  15         34  
  15         93  
6 15     15   24208 use Time::Moment;
  15         26195  
  15         22119  
7              
8             has id => ( is => 'ro', required => 1 );
9             has type => ( is => 'lazy' );
10             has link => ( is => 'lazy' );
11             has filter => ( is => 'lazy' );
12             has images => ( is => 'lazy' );
13             has videos => ( is => 'lazy' );
14             has user => ( is => 'lazy', coerce => \&_coerce_user );
15             has tags => ( is => 'lazy', coerce => \&_coerce_tags );
16             has location => ( is => 'lazy', coerce => \&_coerce_location );
17             has users_in_photo => ( is => 'lazy', coerce => \&_coerce_users_in_photo );
18             has caption => ( is => 'lazy', coerce => sub { $_[0]->{text} if $_[0] and ref $_[0] eq 'HASH' } );
19             has created_time => ( is => 'lazy', coerce => sub { Time::Moment->from_epoch( $_[0] ) } );
20             has _api => ( is => 'lazy' );
21             has _data => ( is => 'rwp', lazy => 1, builder => 1, clearer => 1 );
22              
23             sub likes {
24 2     2 1 1723 my $self = shift;
25 2 100       13 $self->_clear_data if shift;
26 2         500 $self->_data->{likes}->{count}
27             }
28              
29             sub last_likes {
30 2     2 1 524 my $self = shift;
31 2 100       31 $self->_clear_data if shift;
32 2         52 my $api = $self->_api;
33 2         17 [ map { $api->user($_) } @{ $self->_data->{likes}->{data} } ]
  2         88  
  2         39  
34             }
35              
36             sub get_likes {
37 1     1 1 2 my $self = shift;
38 1         3 my %opts = @_;
39 1         6 my $url = sprintf "media/%s/likes", $self->id;
40 1         24 my $api = $self->_api;
41 1         15 [ map { $api->user($_) } $api->_get_list( { %opts, url => $url } ) ]
  1         99  
42             }
43              
44             sub like {
45 1     1 1 6325 my $self = shift;
46 1         7 my $url = sprintf "media/%s/likes", $self->id;
47 1         8 $self->_api->_post( $url )
48             }
49              
50             sub dislike {
51 1     1 1 2 my $self = shift;
52 1         6 my $url = sprintf "media/%s/likes", $self->id;
53 1         22 $self->_api->_del( $url )
54             }
55              
56             sub comments {
57 2     2 1 569 my $self = shift;
58 2 100       36 $self->_clear_data if shift;
59 2         113 $self->_data->{comments}->{count}
60             }
61              
62             sub last_comments {
63 2     2 1 5 my $self = shift;
64 2 100       27 $self->_clear_data if shift;
65 2         52 my $api = $self->_api;
66 2         14 [ map { $api->_comment( { %$_, media => $self } ) } @{ $self->_data->{comments}->{data} } ]
  4         104  
  2         39  
67             }
68              
69             sub get_comments {
70 2     2 1 517 my $self = shift;
71 2         7 my %opts = @_;
72 2         18 my $url = sprintf "media/%s/comments", $self->id;
73 2         38 my $api = $self->_api;
74 2         24 [ map { $api->_comment( { %$_, media => $self } ) } $api->_get_list( { %opts, url => $url } ) ]
  2         84  
75             }
76              
77             sub comment {
78 1     1 1 2 my $self = shift;
79 1         2 my $text = shift;
80 1         6 my $url = sprintf "media/%s/comments", $self->id;
81 1         21 $self->_api->_post( $url, { text => $text } )
82             }
83              
84              
85 3     3   1367 sub _build__api { API::Instagram->instance }
86 1     1   663 sub _build_user { shift->_data->{user} }
87 1     1   2470 sub _build_tags { shift->_data->{tags} }
88 1     1   1518 sub _build_location { shift->_data->{location} }
89 1     1   1180 sub _build_users_in_photo { shift->_data->{users_in_photo} }
90 1     1   1755 sub _build_type { shift->_data->{type} }
91 1     1   757 sub _build_link { shift->_data->{link} }
92 1     1   497 sub _build_filter { shift->_data->{filter} }
93 1     1   856 sub _build_images { shift->_data->{images} }
94 1     1   927 sub _build_videos { shift->_data->{videos} }
95 1     1   982 sub _build_caption { shift->_data->{caption } }
96 1     1   2144 sub _build_created_time { shift->_data->{created_time} }
97              
98             sub _build__data {
99 5     5   415 my $self = shift;
100 5         21 my $url = sprintf "media/%s", $self->id;
101 5         77 $self->_api->_get( $url );
102             }
103              
104             ############################################################
105             # Attributes coercion that API::Instagram object reference #
106             ############################################################
107 4     4   86 sub _coerce_user { API::Instagram->instance->user ( $_[0] ) };
108 4 100   4   157 sub _coerce_location { API::Instagram->instance->location( $_[0] ) if $_[0] };
109              
110             sub _coerce_tags {
111 4     4   58 my $data = $_[0];
112 4 50       20 return if ref $data ne 'ARRAY';
113 4         80 [ map { API::Instagram->instance->tag($_) } @$data ]
  1         6  
114             };
115            
116             sub _coerce_users_in_photo {
117 4     4   62 my $data = $_[0];
118 4 100       38 return if ref $data ne 'ARRAY';
119             [
120 3         86 map {{
  1         5  
121             user => API::Instagram->instance->user( $_->{user} ),
122             position => $_->{position},
123             }} @$data
124             ]
125             };
126              
127              
128             1;
129              
130             __END__