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   14484 use strict;
  42         52  
  42         1052  
4 42     42   134 use warnings;
  42         52  
  42         977  
5              
6 42     42   219 use base 'TAP::Object';
  42         43  
  42         8310  
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.39
16              
17             =cut
18              
19             our $VERSION = '3.39';
20              
21 42         50 use constant GOT_TIME_HIRES => do {
22 42     42   2234 eval 'use Time::HiRes qw(time);';
  42         21758  
  42         49873  
  42         1516  
23 42 50       27281 $@ ? 0 : 1;
24 42     42   182 };
  42         44  
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   1141 my ( $self, $arg_for, $ok_callback ) = @_;
52              
53 590         1202 my %ok_map = map { $_ => 1 } @$ok_callback;
  3484         5784  
54              
55 590         1849 $self->{ok_callbacks} = \%ok_map;
56              
57 590 100       1565 if ( my $cb = delete $arg_for->{callbacks} ) {
58 5         20 while ( my ( $event, $callback ) = each %$cb ) {
59 10         29 $self->callback( $event, $callback );
60             }
61             }
62              
63 588         1292 return $self;
64             }
65              
66             =head3 C
67              
68             Install a callback for a named event.
69              
70             =cut
71              
72             sub callback {
73 154     154 1 4820 my ( $self, $event, $callback ) = @_;
74              
75 154         140 my %ok_map = %{ $self->{ok_callbacks} };
  154         1103  
76              
77 154 100       367 $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 152 100       341 unless exists $ok_map{$event};
83              
84 149         156 push @{ $self->{code_for}{$event} }, $callback;
  149         416  
85              
86 149         408 return;
87             }
88              
89             sub _has_callbacks {
90 278     278   399 my $self = shift;
91 278         355 return keys %{ $self->{code_for} } != 0;
  278         1676  
92             }
93              
94             sub _callback_for {
95 1244     1244   4153 my ( $self, $event ) = @_;
96 1244         1857 return $self->{code_for}{$event};
97             }
98              
99             sub _make_callback {
100 960     960   1739 my $self = shift;
101 960         1039 my $event = shift;
102              
103 960         1404 my $cb = $self->_callback_for($event);
104 960 100       1977 return unless defined $cb;
105 150         244 return map { $_->(@_) } @$cb;
  151         606  
106             }
107              
108             =head3 C
109              
110             Return the current time using Time::HiRes if available.
111              
112             =cut
113              
114 621     621 1 5013 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 3938 sub get_times { return [ times() ] }
132              
133             1;