File Coverage

blib/lib/WWW/Jawbone/Up/JSON.pm
Criterion Covered Total %
statement 53 54 98.1
branch 5 8 62.5
condition n/a
subroutine 17 17 100.0
pod 0 5 0.0
total 75 84 89.2


line stmt bran cond sub pod time code
1             package WWW::Jawbone::Up::JSON;
2              
3 6     6   106 use 5.010;
  6         19  
  6         295  
4 6     6   31 use strict;
  6         9  
  6         163  
5 6     6   30 use warnings;
  6         11  
  6         135  
6              
7 6     6   1349 use Carp;
  6         1259  
  6         482  
8 6     6   36 use DateTime;
  6         11  
  6         321  
9              
10             sub patch {
11 173     173 0 272 my ($class, $method, $code) = @_;
12              
13 6     6   44 no strict 'refs';
  6         11  
  6         3253  
14 173         188 *{ $class . '::' . $method } = $code;
  173         1238  
15             }
16              
17             sub add_accessors {
18 27     27 0 53 my $class = shift;
19              
20 27         83 foreach my $arg (@_) {
21 123 100       299 if (ref $arg eq '') {
    50          
22 104     30   531 $class->patch($arg, sub { my $self = shift; return $self->{$arg} });
  30         18489  
  30         270  
23             } elsif (ref $arg eq 'HASH') {
24 19         62 foreach my $name (keys %$arg) {
25 21         42 my $value = $arg->{$name};
26 21     11   94 $class->patch($name, sub { my $self = shift; return $self->{$value} });
  11         24  
  11         90  
27             }
28             } else {
29 0         0 croak "Invalid argument type: " . ref $arg;
30             }
31             }
32             }
33              
34             sub add_subclass {
35 18     18 0 44 my ($class, $method, $subclass) = @_;
36              
37             $class->patch(
38             $method => sub {
39 4     4   16 my $self = shift;
40              
41 4 50       312 if (ref $self->{$method} ne $subclass) {
42 4     2   710 eval "use $subclass";
  2     2   767  
  2         5  
  2         41  
  2         899  
  2         7  
  2         40  
43 4 50       23 croak $@ if $@;
44 4         35 $self->{$method} = $subclass->new($self->{$method});
45             }
46              
47 4         21 return $self->{$method};
48 18         114 });
49             }
50              
51             sub add_time_accessors {
52 12     12 0 25 my $class = shift;
53              
54 12         30 foreach my $method (@_) {
55             $class->patch(
56             $method => sub {
57 5     5   37623 my $self = shift;
58 5         32 return DateTime->from_epoch(
59             epoch => $self->{ 'time_' . $method },
60             time_zone => $self->timezone,
61             );
62 30         244 });
63             }
64             }
65              
66             sub new {
67 10     10 0 25 my ($class, $json) = @_;
68              
69 10         174 return bless $json, $class;
70             }
71              
72             1;