File Coverage

blib/lib/DBGp/Client/AnyEvent/Connection.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package DBGp::Client::AnyEvent::Connection;
2              
3 2     2   542 use strict;
  2         3  
  2         50  
4 2     2   6 use warnings;
  2         2  
  2         55  
5              
6 2     2   1314 use AnyEvent::Handle;
  2         24176  
  2         66  
7 2     2   963 use DBGp::Client::AsyncConnection;
  0            
  0            
8             use Scalar::Util qw(weaken blessed);
9              
10             sub new {
11             my ($class, %args) = @_;
12             my $self = bless {
13             handle => undef,
14             connection => DBGp::Client::AsyncConnection->new(socket => $args{socket}),
15             }, $class;
16             my $weak_self = $self;
17             weaken($weak_self);
18             my $handle = AnyEvent::Handle->new(
19             fh => $args{socket},
20             on_error => sub {
21             my ($handle, $fatal, $message) = @_;
22              
23             $weak_self->{handle} = undef;
24             $handle->destroy;
25             $weak_self->{connection}->closed;
26             },
27             on_read => sub {
28             my ($handle) = @_;
29              
30             $weak_self->{connection}->add_data($handle->{rbuf});
31             substr $handle->{rbuf}, 0, length($handle->{rbuf}), ''
32             if defined $handle->{rbuf};
33             },
34             on_eof => sub {
35             my ($handle) = @_;
36              
37             $weak_self->{handle} = undef;
38             $handle->destroy;
39             $weak_self->{connection}->closed;
40             },
41             );
42              
43             $self->{handle} = $handle;
44              
45             return $self;
46             }
47              
48             sub DESTROY {
49             my ($self) = @_;
50              
51             $self->{handle}->destroy if $self->{handle} && !$self->{handle}->destroyed;
52             }
53              
54             sub init { $_[0]->{connection}->init }
55              
56             sub send_command {
57             my ($self, $callback_or_condvar, @rest) = @_;
58             my ($condvar, $callback);
59              
60             if (!defined $callback_or_condvar) {
61             $condvar = AnyEvent->condvar;
62             $callback = sub { $condvar->send($_[0]) };
63             } elsif (ref $callback_or_condvar eq 'CODE') {
64             $condvar = AnyEvent->condvar;
65             $callback = sub { $condvar->send($_[0]); $callback_or_condvar->($_[0]); };
66             } elsif (blessed $callback_or_condvar && $callback_or_condvar->isa('AnyEvent::CondVar')) {
67             $condvar = $callback_or_condvar;
68             $callback = sub { $condvar->send($_[0]) };
69             } else {
70             die "callback_or_condvar can be undefined, a code reference or a condvar";
71             }
72             $self->{connection}->send_command($callback, @rest);
73              
74             return $condvar;
75             }
76              
77             1;