File Coverage

blib/lib/Test2/Tools/HTTP/UA.pm
Criterion Covered Total %
statement 59 65 90.7
branch 12 16 75.0
condition 1 3 33.3
subroutine 17 17 100.0
pod 5 5 100.0
total 94 106 88.6


line stmt bran cond sub pod time code
1             package Test2::Tools::HTTP::UA;
2              
3 9     9   191319 use strict;
  9         22  
  9         223  
4 9     9   39 use warnings;
  9         14  
  9         173  
5 9     9   36 use Carp ();
  9         13  
  9         92  
6 9     9   33 use File::Spec ();
  9         19  
  9         143  
7 9     9   3092 use Test2::Tools::HTTP::Apps;
  9         20  
  9         4514  
8              
9             # ABSTRACT: User agent wrapper for Test2::Tools::HTTP
10             our $VERSION = '0.10'; # VERSION
11              
12              
13             sub _init
14             {
15 5     5   16 foreach my $inc (@INC)
16             {
17 55         393 my $dir = File::Spec->catdir($inc, 'Test2/Tools/HTTP/UA');
18 55 100       655 next unless -d $dir;
19 15         33 my $dh;
20 15         439 opendir $dh, $dir;
21 15         522 my @list = sort grep !/^\./, grep /\.pm$/, readdir $dh;
22 15         207 closedir $dh;
23 15         51 foreach my $pm (@list)
24             {
25 30         40 eval { require "Test2/Tools/HTTP/UA/$pm"; };
  30         3941  
26 30 50       152 if(my $error = $@)
27             {
28 0         0 warn $error;
29             }
30             }
31             }
32             }
33              
34             my %classes;
35             my %instance;
36              
37             sub new
38             {
39 12     12 1 2703 my($class, $ua) = @_;
40              
41 12 100       42 if($class eq __PACKAGE__)
42             {
43 5         22 _init();
44 5         12 my $class;
45              
46 5 50 33     40 if(ref($ua) eq '' && defined $ua)
47             {
48 0         0 ($class) = @{ $classes{$ua} };
  0         0  
49             }
50             else
51             {
52 5         22 foreach my $try (keys %instance)
53             {
54 6 100       14 if(eval { $ua->isa($try) })
  6         61  
55             {
56 5         12 ($class) = @{ $instance{$try} };
  5         22  
57             }
58             }
59             }
60              
61 5 50       18 if(defined $class)
62             {
63 5         62 return $class->new($ua);
64             }
65             else
66             {
67 0         0 Carp::croak("user agent @{[ ref $ua ]} not supported ");
  0         0  
68             }
69             }
70              
71             bless {
72 7         40 ua => $ua,
73             }, $class;
74             }
75              
76              
77             sub ua
78             {
79 83     83 1 19284 shift->{ua};
80             }
81              
82              
83             sub apps
84             {
85 98     98 1 378 Test2::Tools::HTTP::Apps->new;
86             }
87              
88              
89             sub error
90             {
91 1     1 1 667 my(undef, $message, $res) = @_;
92 1         7 my $error = bless { message => $message, res => $res }, 'Test2::Tools::HTTP::UA::Error';
93 1         9 die $error;
94             }
95              
96              
97             sub register
98             {
99 15     15 1 130 my(undef, $class, $type) = @_;
100 15         43 my $caller = caller;
101 15 100       64 if($type eq 'class')
    50          
102             {
103 7         16 push @{ $classes{$class} }, $caller;
  7         30  
104             }
105             elsif($type eq 'instance')
106             {
107 8         58 push @{ $instance{$class} }, $caller;
  8         39  
108             }
109             else
110             {
111 0         0 Carp::croak("unknown type for $class: $type");
112             }
113             }
114              
115             package Test2::Tools::HTTP::UA::Error;
116              
117             use overload
118 2     2   11 '""' => sub { shift->as_string },
119 9     9   62 bool => sub { 1 }, fallback => 1;
  9     2   16  
  9         88  
  2         6  
120              
121 2     2   7 sub message { shift->{message} }
122 1     1   3 sub res { shift->{res} }
123 2     2   6 sub as_string { shift->message }
124              
125             1;
126              
127             __END__