File Coverage

blib/lib/TAP/Base.pm
Criterion Covered Total %
statement 46 47 97.8
branch 9 10 90.0
condition n/a
subroutine 12 13 92.3
pod 4 4 100.0
total 71 74 95.9


line stmt bran cond sub pod time code
1             package TAP::Base;
2              
3 42     42   17085 use strict;
  42         45  
  42         982  
4 42     42   135 use warnings;
  42         44  
  42         917  
5              
6 42     42   162 use base 'TAP::Object';
  42         46  
  42         7963  
7              
8             =head1 NAME
9              
10             TAP::Base - Base class that provides common functionality to L
11             and L
12              
13             =head1 VERSION
14              
15             Version 3.38
16              
17             =cut
18              
19             our $VERSION = '3.38';
20              
21 42         54 use constant GOT_TIME_HIRES => do {
22 42     42   2082 eval 'use Time::HiRes qw(time);';
  42         20234  
  42         47401  
  42         834  
23 42 50       26357 $@ ? 0 : 1;
24 42     42   165 };
  42         41  
25              
26             =head1 SYNOPSIS
27              
28             package TAP::Whatever;
29              
30             use base 'TAP::Base';
31              
32             # ... later ...
33            
34             my $thing = TAP::Whatever->new();
35            
36             $thing->callback( event => sub {
37             # do something interesting
38             } );
39              
40             =head1 DESCRIPTION
41              
42             C provides callback management.
43              
44             =head1 METHODS
45              
46             =head2 Class Methods
47              
48             =cut
49              
50             sub _initialize {
51 590     590   926 my ( $self, $arg_for, $ok_callback ) = @_;
52              
53 590         1173 my %ok_map = map { $_ => 1 } @$ok_callback;
  3484         5678  
54              
55 590         1837 $self->{ok_callbacks} = \%ok_map;
56              
57 590 100       1621 if ( my $cb = delete $arg_for->{callbacks} ) {
58 5         21 while ( my ( $event, $callback ) = each %$cb ) {
59 11         30 $self->callback( $event, $callback );
60             }
61             }
62              
63 588         1289 return $self;
64             }
65              
66             =head3 C
67              
68             Install a callback for a named event.
69              
70             =cut
71              
72             sub callback {
73 155     155 1 6360 my ( $self, $event, $callback ) = @_;
74              
75 155         147 my %ok_map = %{ $self->{ok_callbacks} };
  155         1111  
76              
77 155 100       383 $self->_croak('No callbacks may be installed')
78             unless %ok_map;
79              
80             $self->_croak( "Callback $event is not supported. Valid callbacks are "
81             . join( ', ', sort keys %ok_map ) )
82 153 100       364 unless exists $ok_map{$event};
83              
84 150         144 push @{ $self->{code_for}{$event} }, $callback;
  150         449  
85              
86 150         482 return;
87             }
88              
89             sub _has_callbacks {
90 278     278   399 my $self = shift;
91 278         584 return keys %{ $self->{code_for} } != 0;
  278         1703  
92             }
93              
94             sub _callback_for {
95 1244     1244   5674 my ( $self, $event ) = @_;
96 1244         1927 return $self->{code_for}{$event};
97             }
98              
99             sub _make_callback {
100 960     960   2255 my $self = shift;
101 960         1140 my $event = shift;
102              
103 960         1409 my $cb = $self->_callback_for($event);
104 960 100       2105 return unless defined $cb;
105 150         261 return map { $_->(@_) } @$cb;
  151         504  
106             }
107              
108             =head3 C
109              
110             Return the current time using Time::HiRes if available.
111              
112             =cut
113              
114 621     621 1 5015 sub get_time { return time() }
115              
116             =head3 C
117              
118             Return true if the time returned by get_time is high resolution (i.e. if Time::HiRes is available).
119              
120             =cut
121              
122 0     0 1 0 sub time_is_hires { return GOT_TIME_HIRES }
123              
124             =head3 C
125              
126             Return array reference of the four-element list of CPU seconds,
127             as with L.
128              
129             =cut
130              
131 547     547 1 4346 sub get_times { return [ times() ] }
132              
133             1;