File Coverage

blib/lib/Package/Watchdog/Tracker.pm
Criterion Covered Total %
statement 35 35 100.0
branch 9 10 90.0
condition 2 3 66.6
subroutine 8 8 100.0
pod 4 4 100.0
total 58 60 96.6


line stmt bran cond sub pod time code
1             package Package::Watchdog::Tracker;
2 5     5   955 use strict;
  5         10  
  5         229  
3 5     5   28 use warnings;
  5         11  
  5         178  
4 5     5   29 use Carp;
  5         9  
  5         346  
5 5     5   773 use Package::Watchdog::Util;
  5         9  
  5         2917  
6              
7             #{{{ POD
8              
9             =pod
10              
11             =head1 NAME
12              
13             Package::Watchdog::Tracker - Base class for objects that track overriden subs.
14              
15             =head1 DESCRIPTION
16              
17             Base class for objects that track overriden subs.
18              
19             =head1 ACCESSORS
20              
21             The following accessors methods are automatically generated using
22             Package::Watchdog::Util::build_accessors().
23              
24             =head1 METHODS
25              
26             =over 4
27              
28             =cut
29              
30             #}}}
31              
32             my @ACCESSORS = qw/package stack/;
33             build_accessors( @ACCESSORS );
34              
35             =item track()
36              
37             Starts tracking the specified subs.
38              
39             =cut
40              
41             sub track {
42 12     12 1 14 my $self = shift;
43 12         45 my %seen;
44 12         15 for my $sub (@{ expand_subs( $self->package, $self->subs )}) {
  12         34  
45 25 50       71 next if $seen{$sub}++;
46 25         79 $self->track_sub( $sub )
47             }
48 12         38 return $self;
49             }
50              
51             =item init( $self, @params )
52              
53             Should be overriden by a subclass. Called by new after object construction.
54              
55             =cut
56              
57             sub init {
58 4     4 1 7 my $self = shift;
59 4         5 return $self;
60             }
61              
62             =item new( @params )
63              
64             All params are passed into init(). Creates a new instance of the tracker, also
65             runs track() to begin tracking subs..
66              
67             =cut
68              
69             sub new {
70 15     15 1 7899 my $class = shift;
71 15         90 my %params = @_;
72              
73 15         64 my $self = bless({ tracked => [] }, $class );
74              
75 15         47 my ( $package, $stack, $subs ) = @params{(@ACCESSORS, 'subs')};
76 15 100       71 croak( "Must specify a package to track" )
77             unless $package;
78 14 100 66     102 croak( "Must provide a reference to the stack" )
79             unless $stack && ref( $stack ) eq 'ARRAY';
80              
81 13         78 $self->$_( $params{ $_ } ) for (@ACCESSORS, 'subs');
82 13 100       41 $self->subs( [ '*' ] ) unless $self->subs;
83              
84 13         68 $self->init( %params );
85 12         49 $self->track();
86              
87 12         43 return $self;
88             }
89              
90             =item subs()
91              
92             Returns the list of all subs that should be watched.
93              
94             =cut
95              
96             sub subs {
97 32     32 1 43 my $self = shift;
98 32 100       83 $self->{ subs } = shift( @_ ) if @_;
99 32         85 return expand_subs( $self->package, $self->{ subs } );
100             }
101              
102             1;
103              
104             __END__