| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package WWW::WebDevout::BrowserSupportInfo; | 
| 2 |  |  |  |  |  |  |  | 
| 3 | 1 |  |  | 1 |  | 95661 | use warnings; | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 43 |  | 
| 4 | 1 |  |  | 1 |  | 4 | use strict; | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 61 |  | 
| 5 |  |  |  |  |  |  |  | 
| 6 |  |  |  |  |  |  | our $VERSION = '0.0103'; | 
| 7 |  |  |  |  |  |  |  | 
| 8 | 1 |  |  | 1 |  | 5 | use Carp; | 
|  | 1 |  |  |  |  | 6 |  | 
|  | 1 |  |  |  |  | 71 |  | 
| 9 | 1 |  |  | 1 |  | 5 | use URI; | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 25 |  | 
| 10 | 1 |  |  | 1 |  | 5 | use LWP::UserAgent; | 
|  | 1 |  |  |  |  | 1 |  | 
|  | 1 |  |  |  |  | 34 |  | 
| 11 | 1 |  |  | 1 |  | 5 | use overload '%{}' => \&_overload; | 
|  | 1 |  |  |  |  | 1 |  | 
|  | 1 |  |  |  |  | 10 |  | 
| 12 |  |  |  |  |  |  |  | 
| 13 |  |  |  |  |  |  | sub _overload { | 
| 14 | 0 |  |  | 0 |  | 0 | return shift->browser_results; | 
| 15 |  |  |  |  |  |  | } | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | sub new { | 
| 18 | 1 |  |  | 1 | 1 | 199 | my $class = shift; | 
| 19 | 1 | 50 |  |  |  | 4 | croak "Even number of arguments expected to new()" | 
| 20 |  |  |  |  |  |  | if @_ & 1; | 
| 21 | 1 |  |  |  |  | 3 | my %args = @_; | 
| 22 | 1 |  |  |  |  | 4 | $args{ +uc } = delete $args{ $_ } for keys %args; | 
| 23 |  |  |  |  |  |  |  | 
| 24 | 1 |  |  |  |  | 8 | %args = ( | 
| 25 |  |  |  |  |  |  | LONG        => 0, | 
| 26 |  |  |  |  |  |  | BROWSERS    => [ qw(IE6 IE7 IE8 FX1_5 FX2 FX3 OP8 OP9 KN3_5 SF2) ], | 
| 27 |  |  |  |  |  |  | %args, | 
| 28 |  |  |  |  |  |  | ); | 
| 29 |  |  |  |  |  |  | #IE6-IE7-FX1_5-FX2-OP8-OP9-KN3_5-SF2 | 
| 30 |  |  |  |  |  |  |  | 
| 31 | 1 | 50 |  |  |  | 5 | unless ( exists $args{UA_ARGS}{timeout} ) { | 
| 32 | 1 |  |  |  |  | 2 | $args{UA_ARGS}{timeout} = 30; | 
| 33 |  |  |  |  |  |  | } | 
| 34 |  |  |  |  |  |  |  | 
| 35 | 1 |  |  |  |  | 6 | return bless [ \%args ], $class; | 
| 36 |  |  |  |  |  |  | } | 
| 37 |  |  |  |  |  |  |  | 
| 38 |  |  |  |  |  |  | sub fetch { | 
| 39 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 40 | 0 |  |  |  |  |  | my $input = shift; | 
| 41 |  |  |  |  |  |  |  | 
| 42 | 0 | 0 |  |  |  |  | croak "Undefined argument to fetch()" | 
| 43 |  |  |  |  |  |  | unless defined $input; | 
| 44 |  |  |  |  |  |  |  | 
| 45 | 0 |  |  |  |  |  | my $uri = URI->new('http://www.webdevout.net/lookup-support'); | 
| 46 | 0 |  |  |  |  |  | $uri->query_form( | 
| 47 |  |  |  |  |  |  | 'q'   => $input, | 
| 48 | 0 |  |  |  |  |  | 'uas' => join '-', @{ $self->browsers } | 
| 49 |  |  |  |  |  |  | ); | 
| 50 | 0 | 0 |  |  |  |  | my $ua = LWP::UserAgent->new( %{ $self->ua_args || {} } ); | 
|  | 0 |  |  |  |  |  |  | 
| 51 |  |  |  |  |  |  |  | 
| 52 | 0 |  |  |  |  |  | my $response = $ua->get( $uri ); | 
| 53 |  |  |  |  |  |  |  | 
| 54 | 0 | 0 |  |  |  |  | if ( $response->is_success ) { | 
| 55 | 0 |  |  |  |  |  | return $self->_parse_fetched( $response->content ); | 
| 56 |  |  |  |  |  |  | } | 
| 57 |  |  |  |  |  |  | else { | 
| 58 | 0 |  |  |  |  |  | $self->error( $response->status_line ); | 
| 59 | 0 |  |  |  |  |  | return; | 
| 60 |  |  |  |  |  |  | } | 
| 61 |  |  |  |  |  |  | } | 
| 62 |  |  |  |  |  |  |  | 
| 63 |  |  |  |  |  |  | sub _parse_fetched { | 
| 64 | 0 |  |  | 0 |  |  | my $self = shift; | 
| 65 | 0 |  |  |  |  |  | my $content = shift; | 
| 66 | 0 | 0 |  |  |  |  | $content =~ s/^\s+|\s+$//g | 
| 67 |  |  |  |  |  |  | if defined $content; | 
| 68 | 0 | 0 | 0 |  |  |  | if ( not defined $content or not length $content ) { | 
| 69 | 0 |  |  |  |  |  | $self->error('No results'); | 
| 70 | 0 |  |  |  |  |  | return; | 
| 71 |  |  |  |  |  |  | } | 
| 72 |  |  |  |  |  |  |  | 
| 73 | 0 |  |  |  |  |  | my %results; | 
| 74 | 0 |  |  |  |  |  | ( my ( $what, $uri_info), @results{ @{ $self->browsers } } ) | 
|  | 0 |  |  |  |  |  |  | 
| 75 | 0 |  |  |  |  |  | = grep { defined } split /\n/, $content; | 
| 76 |  |  |  |  |  |  |  | 
| 77 | 0 |  |  |  |  |  | keys %results; | 
| 78 | 0 |  |  |  |  |  | while ( my ( $browser, $info ) = each %results ) { | 
| 79 | 0 | 0 |  |  |  |  | $info =~ s/^\s*.+?:\s*// | 
| 80 |  |  |  |  |  |  | if defined $info; | 
| 81 | 0 |  |  |  |  |  | $results{ $browser } = $info; | 
| 82 | 0 |  |  |  |  |  | $self->browser_info( $browser => $info ); | 
| 83 |  |  |  |  |  |  | } | 
| 84 |  |  |  |  |  |  |  | 
| 85 | 0 | 0 |  |  |  |  | if ( $self->long ) { | 
| 86 |  |  |  |  |  |  | $results{ $self->make_long_name( $_ ) } | 
| 87 | 0 |  |  |  |  |  | = delete $results{ $_ } for keys %results; | 
| 88 |  |  |  |  |  |  | } | 
| 89 |  |  |  |  |  |  |  | 
| 90 | 0 |  |  |  |  |  | $self->browser_results( { %results } ); | 
| 91 | 0 |  |  |  |  |  | $self->what( $what ); | 
| 92 | 0 |  |  |  |  |  | $self->uri_info( $uri_info ); | 
| 93 | 0 |  |  |  |  |  | @results{ qw(what  uri_info) } = ( $what, $uri_info ); | 
| 94 |  |  |  |  |  |  |  | 
| 95 | 0 |  |  |  |  |  | return $self->results( \%results ); | 
| 96 |  |  |  |  |  |  | } | 
| 97 |  |  |  |  |  |  |  | 
| 98 |  |  |  |  |  |  | sub make_long_name { | 
| 99 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 100 | 0 | 0 |  |  |  |  | my $short_ua = shift | 
| 101 |  |  |  |  |  |  | or return; | 
| 102 | 0 |  |  |  |  |  | my %long_name_for = ( | 
| 103 |  |  |  |  |  |  | IE6     => 'Internet Explorer 6', | 
| 104 |  |  |  |  |  |  | IE7     => 'Internet Explorer 7', | 
| 105 |  |  |  |  |  |  | IE8     => 'Internet Explorer 7', | 
| 106 |  |  |  |  |  |  | FX1_5   => 'FireFox 1.5', | 
| 107 |  |  |  |  |  |  | FX2     => 'FireFox 2', | 
| 108 |  |  |  |  |  |  | FX3     => 'FireFox 3', | 
| 109 |  |  |  |  |  |  | OP8     => 'Opera 8', | 
| 110 |  |  |  |  |  |  | OP9     => 'Opera 9', | 
| 111 |  |  |  |  |  |  | KN3_5   => 'Konqueror 3.5', | 
| 112 |  |  |  |  |  |  | SF2     => 'Safari 2', | 
| 113 |  |  |  |  |  |  | ); | 
| 114 |  |  |  |  |  |  |  | 
| 115 | 0 |  |  |  |  |  | return $long_name_for{ $short_ua }; | 
| 116 |  |  |  |  |  |  | } | 
| 117 |  |  |  |  |  |  |  | 
| 118 |  |  |  |  |  |  | ###### ACCESSORS/MUTATORS | 
| 119 |  |  |  |  |  |  |  | 
| 120 |  |  |  |  |  |  | sub browser_info { | 
| 121 | 0 |  |  | 0 | 1 |  | my ( $self, $browser ) = splice @_, 0, 2; | 
| 122 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 123 | 0 |  |  |  |  |  | $self->[0]{INFO}{ $browser } = shift; | 
| 124 |  |  |  |  |  |  | } | 
| 125 | 0 |  |  |  |  |  | return $self->[0]{INFO}{ $browser }; | 
| 126 |  |  |  |  |  |  | } | 
| 127 |  |  |  |  |  |  |  | 
| 128 |  |  |  |  |  |  | sub error { | 
| 129 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 130 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 131 | 0 |  |  |  |  |  | $self->[0]{ ERROR } = shift; | 
| 132 |  |  |  |  |  |  | } | 
| 133 | 0 |  |  |  |  |  | return $self->[0]{ ERROR }; | 
| 134 |  |  |  |  |  |  | } | 
| 135 |  |  |  |  |  |  |  | 
| 136 |  |  |  |  |  |  | sub ua_args { | 
| 137 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 138 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 139 | 0 |  |  |  |  |  | $self->[0]{ UA_ARGS } = shift; | 
| 140 |  |  |  |  |  |  | } | 
| 141 | 0 |  |  |  |  |  | return $self->[0]{ UA_ARGS }; | 
| 142 |  |  |  |  |  |  | } | 
| 143 |  |  |  |  |  |  |  | 
| 144 |  |  |  |  |  |  | sub long { | 
| 145 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 146 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 147 | 0 |  |  |  |  |  | $self->[0]{ LONG } = shift; | 
| 148 |  |  |  |  |  |  | } | 
| 149 | 0 |  |  |  |  |  | return $self->[0]{ LONG }; | 
| 150 |  |  |  |  |  |  | } | 
| 151 |  |  |  |  |  |  |  | 
| 152 |  |  |  |  |  |  | sub results { | 
| 153 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 154 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 155 | 0 |  |  |  |  |  | $self->[0]{ RESULTS } = shift; | 
| 156 |  |  |  |  |  |  | } | 
| 157 | 0 |  |  |  |  |  | return $self->[0]{ RESULTS }; | 
| 158 |  |  |  |  |  |  | } | 
| 159 |  |  |  |  |  |  |  | 
| 160 |  |  |  |  |  |  | sub browser_results { | 
| 161 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 162 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 163 | 0 |  |  |  |  |  | $self->[0]{ BROWSER_RESULTS } = shift; | 
| 164 |  |  |  |  |  |  | } | 
| 165 | 0 |  |  |  |  |  | return $self->[0]{ BROWSER_RESULTS }; | 
| 166 |  |  |  |  |  |  | } | 
| 167 |  |  |  |  |  |  |  | 
| 168 |  |  |  |  |  |  |  | 
| 169 |  |  |  |  |  |  | sub what { | 
| 170 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 171 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 172 | 0 |  |  |  |  |  | $self->[0]{ WHAT } = shift; | 
| 173 |  |  |  |  |  |  | } | 
| 174 | 0 |  |  |  |  |  | return $self->[0]{ WHAT }; | 
| 175 |  |  |  |  |  |  | } | 
| 176 |  |  |  |  |  |  |  | 
| 177 |  |  |  |  |  |  |  | 
| 178 |  |  |  |  |  |  | sub uri_info { | 
| 179 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 180 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 181 | 0 |  |  |  |  |  | $self->[0]{ URI_INFO } = shift; | 
| 182 |  |  |  |  |  |  | } | 
| 183 | 0 |  |  |  |  |  | return $self->[0]{ URI_INFO }; | 
| 184 |  |  |  |  |  |  | } | 
| 185 |  |  |  |  |  |  |  | 
| 186 |  |  |  |  |  |  | sub browsers { | 
| 187 | 0 |  |  | 0 | 1 |  | my $self = shift; | 
| 188 | 0 | 0 |  |  |  |  | if ( @_ ) { | 
| 189 | 0 |  |  |  |  |  | $self->[0]{ BROWSERS } = shift; | 
| 190 |  |  |  |  |  |  | } | 
| 191 | 0 |  |  |  |  |  | return $self->[0]{ BROWSERS }; | 
| 192 |  |  |  |  |  |  | } | 
| 193 |  |  |  |  |  |  |  | 
| 194 |  |  |  |  |  |  |  | 
| 195 |  |  |  |  |  |  | 1; | 
| 196 |  |  |  |  |  |  |  | 
| 197 |  |  |  |  |  |  | __END__ |