File Coverage

blib/lib/Google/Search/Result.pm
Criterion Covered Total %
statement 57 89 64.0
branch 0 8 0.0
condition 0 3 0.0
subroutine 19 117 16.2
pod 3 5 60.0
total 79 222 35.5


line stmt bran cond sub pod time code
1             package Google::Search::Result;
2              
3             =head1 NAME
4              
5             Google::Search::Result
6              
7             =head1 DESCRIPTION
8              
9             An object represting a result from a Google search (via L)
10              
11             =head1 METHODS
12              
13             There are a variety of property accessors associated with each result depending which
14             service you use (web, blog, news, local, etc.)
15              
16             For more information, see L
17              
18             For example, a local result has C accessor and C accessor:
19              
20             print $result->uri, " ", $result->title, " at ", $result->lat, " ", $result->lng, "\n";
21              
22             =head2 $result->uri
23              
24             A L object best representing the location of the result
25              
26             =head2 $result->title
27              
28             "Supplies the title value of the result"
29              
30             =head2 $result->titleNoFormatting
31              
32             "Supplies the title, but unlike .title, this property is stripped of html markup (e.g., , , etc.)"
33              
34             =head2 $result->rank
35              
36             The position of the result in the search (0-based)
37              
38             =head2 $result->previous
39              
40             The previous result before $result or undef if beyond the first
41              
42             =head2 $result->next
43              
44             The next result after $result or undef if after the last
45              
46             =head2 $result->GsearchResultClass
47              
48             "Indicates the "type" of result"
49              
50             The result class as given by Google
51              
52             =cut
53              
54             our $field = sub {
55             my $package = caller;
56             my %field = @_;
57              
58             my $name = $field{name};
59              
60             $package->meta->add_attribute( $name => qw/ is ro lazy_build 1 / );
61             $package->meta->add_method( "_build_$name" => sub {
62 0     0     my $self = shift;
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
63 0           my $value = $self->get( $name );
64 0 0 0       $value = URI->new( $value ) if $value && $field{uri};
65 0           return $value;
66             } );
67             };
68              
69 5     5   27 use Any::Moose;
  5         12  
  5         34  
70 5     5   2487 use Google::Search::Carp;
  5         9  
  5         37  
71              
72 5     5   5786 use URI;
  5         30634  
  5         1973  
73              
74             has page => qw/ is ro required 1 isa Google::Search::Page /, handles => [qw/ http_response /];
75             has search => qw/ is ro required 1 isa Google::Search /;
76             has number => qw/ is ro isa Int required 1 /;
77 0     0 1   sub rank { return shift->number( @_ ) }
78             has _content => qw/ is ro required 1 /;
79             $field->( name => $_ ) for qw/ GsearchResultClass /;
80              
81             sub previous {
82 0     0 1   my $self = shift;
83 0           my $number = $self->number;
84 0 0         return undef unless $number > 0;
85 0           return $self->search->result( $number - 1 );
86             }
87              
88             sub next {
89 0     0 1   my $self = shift;
90 0           return $self->search->result( $self->number + 1 );
91             }
92              
93             sub get {
94 0     0 0   my $self = shift;
95 0           my $field = shift;
96              
97 0 0         return unless $field;
98 0           return $self->_content->{$field};
99             }
100              
101             sub parse {
102 0     0 0   my $class = shift;
103 0           my $content = shift;
104 0           my $GsearchResultClass = $content->{GsearchResultClass};
105 0           my $result_class;
106 0           ($result_class) = $GsearchResultClass =~ m/^G(\w+)Search/;
107 0 0         croak "Don't know how to parse $GsearchResultClass" unless $result_class;
108 0           $result_class = ucfirst $result_class;
109 0           $result_class = "Google::Search::Result::$result_class";
110 0           return $result_class->new(_content => $content, @_);
111             }
112              
113             package Google::Search::Result::Web;
114              
115 5     5   139 use Any::Moose;
  5         9  
  5         45  
116 5     5   3236 use Google::Search::Carp;
  5         10  
  5         132  
117             extends qw/ Google::Search::Result /;
118              
119             $field->( name => $_ ) for qw/
120             title
121             titleNoFormatting
122             visibleUrl
123             content
124             /;
125              
126             $field->( name => $_, uri => 1 ) for qw/
127             unescapedUrl
128             cacheUrl
129             /;
130              
131 0     0     sub uri { return shift->unescapedUrl(@_) }
132              
133             package Google::Search::Result::Local;
134              
135 5     5   1576 use Any::Moose;
  5         31  
  5         21  
136 5     5   2341 use Google::Search::Carp;
  5         9  
  5         23  
137             extends qw/ Google::Search::Result /;
138              
139             $field->( name => $_ ) for qw/
140             title
141             titleNoFormatting
142             lat
143             lng
144             streetAddress
145             city
146             region
147             country
148             phoneNumbers
149             addressLines
150             /;
151              
152             $field->( name => $_, uri => 1 ) for qw/
153             url
154             ddUrl
155             ddUrlToHere
156             ddUrlFromHere
157             staticMapUrl
158             /;
159              
160 0     0     sub uri { return shift->url(@_) }
161              
162             package Google::Search::Result::Video;
163              
164 5     5   1483 use Any::Moose;
  5         17  
  5         22  
165 5     5   2505 use Google::Search::Carp;
  5         10  
  5         50  
166             extends qw/ Google::Search::Result /;
167              
168             $field->( name => $_ ) for qw/
169             title
170             titleNoFormatting
171             content
172             published
173             publisher
174             duration
175             tbWidth
176             tbHeight
177             /;
178              
179             $field->( name => $_, uri => 1 ) for qw/
180             url
181             tbUrl
182             playUrl
183             /;
184              
185 0     0     sub uri { return shift->url(@_) }
186              
187             package Google::Search::Result::Blog;
188              
189 5     5   1411 use Any::Moose;
  5         10  
  5         21  
190 5     5   2538 use Google::Search::Carp;
  5         10  
  5         21  
191             extends qw/ Google::Search::Result /;
192              
193             $field->( name => $_ ) for qw/
194             title
195             titleNoFormatting
196             content
197             publishedDate
198             author
199             /;
200              
201             $field->( name => $_, uri => 1 ) for qw/
202             blogUrl
203             postUrl
204             /;
205              
206 0     0     sub uri { return shift->postUrl(@_) }
207              
208             package Google::Search::Result::News;
209              
210 5     5   1091 use Any::Moose;
  5         9  
  5         20  
211 5     5   2375 use Google::Search::Carp;
  5         11  
  5         25  
212             extends qw/ Google::Search::Result /;
213              
214             $field->( name => $_ ) for qw/
215             title
216             titleNoFormatting
217             content
218             url
219             publisher
220             location
221             publishedDate
222             /;
223              
224             $field->( name => $_, uri => 1 ) for qw/
225             unescapedUrl
226             clusterUrl
227             /;
228              
229 0     0     sub uri { return shift->unescapedUrl(@_) }
230              
231             package Google::Search::Result::Book;
232              
233 5     5   1292 use Any::Moose;
  5         9  
  5         20  
234 5     5   2208 use Google::Search::Carp;
  5         11  
  5         20  
235             extends qw/ Google::Search::Result /;
236              
237             $field->( name => $_ ) for
238             qw/
239             title
240             titleNoFormatting
241             content
242             url
243             authors
244             publishedYear
245             bookId
246             pageCount
247             tbWidth
248             tbHeight
249             /;
250              
251             $field->( name => $_, uri => 1 ) for
252             qw/
253             unescapedUrl
254             tbUrl
255             /;
256              
257 0     0     sub uri { return shift->unescapedUrl(@_) }
258              
259             package Google::Search::Result::Image;
260              
261 5     5   1376 use Any::Moose;
  5         9  
  5         22  
262 5     5   2382 use Google::Search::Carp;
  5         8  
  5         23  
263             extends qw/ Google::Search::Result /;
264              
265             $field->( name => $_ ) for qw/
266             title
267             titleNoFormatting
268             content
269             contentNoFormatting
270             url
271             visibleUrl
272             width
273             height
274             tbWidth
275             tbHeight
276             /;
277              
278             $field->( name => $_, uri => 1 ) for qw/
279             unescapedUrl
280             originalContextUrl
281             tbUrl
282             /;
283              
284 0     0     sub uri { return shift->unescapedUrl(@_) }
285              
286             package Google::Search::Result::Patent;
287              
288 5     5   1115 use Any::Moose;
  5         9  
  5         27  
289 5     5   2300 use Google::Search::Carp;
  5         9  
  5         25  
290             extends qw/ Google::Search::Result /;
291              
292             $field->( name => $_ ) for qw/
293             title
294             titleNoFormatting
295             content
296             url
297             applicationDate
298             patentNumber
299             patentStatus
300             assignee
301             /;
302              
303             $field->( name => $_, uri => 1 ) for qw/
304             unescapedUrl
305             originalContextUrl
306             tbUrl
307             /;
308              
309 0     0     sub uri { return shift->unescapedUrl(@_) }
310              
311             1;