File Coverage

blib/lib/Weixin/Client/Base.pm
Criterion Covered Total %
statement 12 46 26.0
branch 0 8 0.0
condition 0 3 0.0
subroutine 4 11 36.3
pod 0 5 0.0
total 16 73 21.9


line stmt bran cond sub pod time code
1             package Weixin::Client::Base;
2 1     1   1515 use Time::HiRes;
  1         1135  
  1         4  
3 1     1   82 use AE;
  1         1  
  1         759  
4 1     1   4 use Carp;
  1         2  
  1         50  
5 1     1   487 use JSON ();
  1         7642  
  1         242  
6             sub now{
7 0     0 0   my $self = shift;
8 0           return int Time::HiRes::time() * 1000;
9             }
10             sub json_decode {
11 0     0 0   my $self = shift;
12 0           my $json = shift;
13 0           my $d;
14 0           eval{
15 0           $d = JSON->new->utf8->decode($json);
16             };
17 0 0         die $@ if $@;
18 0           return $d;
19             }
20             sub json_encode {
21 0     0 0   my $self = shift;
22 0           my $d = shift;
23 0           my $json;
24 0           eval{
25 0           $json = JSON->new->utf8->encode($d);
26             };
27 0 0         die $@ if $@;
28 0           return $json;
29             }
30              
31             sub timer {
32 0     0 0   my $self = shift;
33 0           my $delay = shift;
34 0           my $callback = shift;
35 0           my $rand_watcher_id = rand();
36             $self->{_watchers}{$rand_watcher_id} = AE::timer $delay,0,sub{
37 0     0     delete $self->{_watchers}{$rand_watcher_id};
38 0           $callback->();
39 0           };
40            
41             }
42              
43             sub timer2 {
44 0     0 0   my $self = shift;
45 0           my ($id,$interval,$callback) = @_;
46 0           my $delay = 0;
47 0           my $now = time;
48 0 0 0       if(exists $self->{_intervals}{$id} and defined $self->{_intervals}{$id}{_last_dispatch_time}){
49 0 0         $delay = $now<$self->{_intervals}{$id}{_last_dispatch_time} + $interval?
50             $self->{_intervals}{$id}{_last_dispatch_time}+$interval - $now
51             : 0;
52             $self->timer($delay,sub{
53 0     0     $self->{_intervals}{$id}{_last_dispatch_time} = time;
54 0           $callback->();
55 0           });
56             }
57             else{
58 0           $self->{_intervals}{$id}{_last_dispatch_time} = time;
59 0           $callback->();
60             }
61            
62             }
63              
64             1;