File Coverage

blib/lib/Astro/App/Satpass2/Macro.pm
Criterion Covered Total %
statement 48 59 81.3
branch 9 18 50.0
condition 4 12 33.3
subroutine 14 18 77.7
pod 11 11 100.0
total 86 118 72.8


line stmt bran cond sub pod time code
1             package Astro::App::Satpass2::Macro;
2              
3 20     20   11650 use 5.008;
  20         80  
4              
5 20     20   130 use strict;
  20         33  
  20         535  
6 20     20   104 use warnings;
  20         36  
  20         1225  
7              
8 20         3059 use Astro::App::Satpass2::Utils qw{
9             instance
10             CODE_REF
11             @CARP_NOT
12 20     20   123 };
  20         38  
13 20     20   7083 use Astro::App::Satpass2::Warner;
  20         54  
  20         982  
14 20     20   152 use Scalar::Util 1.26 qw{ weaken };
  20         386  
  20         16301  
15              
16             our $VERSION = '0.057';
17              
18             sub new {
19 17     17 1 223 my ( $class, %arg ) = @_;
20 17   33     147 my $self = bless \%arg, ref $class || $class;
21 17         128 $self->init();
22 16         125 return $self;
23             }
24              
25             sub execute {
26 0     0 1 0 __PACKAGE__->weep( 'execute() must be overridden' );
27 0         0 return; # weep() dies, but Perl::Critic does not know this.
28             }
29              
30             sub generator {
31 9     9 1 27 my ( $self, @args ) = @_;
32             $self->{generate}
33 9 50       32 or $self->weep( q{'generate' attribute not specified} );
34             @args
35 9 50       23 or return $self->{generate}->( $self, sort $self->implements() );
36 9         28 foreach my $macro ( @args ) {
37 9         51 $self->implements( $macro, required => 1 );
38             }
39 9         36 return $self->{generate}->( $self, @args );
40             }
41              
42             sub implements {
43 28     28 1 92 my ( $self, $name, %arg ) = @_;
44             defined $name
45 28 50       80 or return ( keys %{ $self->{implements} } );
  0         0  
46             $self->{implements}{$name}
47             or not $arg{required}
48 28 50 33     105 or $self->wail( "This object does not implement macro $name" );
49 28         104 return $self->{implements}{$name};
50             }
51              
52             sub init {
53 17     17 1 43 my ( $self ) = @_;
54 17   33     89 $self->{warner} ||= Astro::App::Satpass2::Warner->new();
55              
56             defined $self->{generate}
57             and CODE_REF ne ref $self->{generate}
58 17 50 33     125 and $self->wail( q{If specified, 'generate' must be a code ref} );
59              
60             defined $self->{name}
61 17 50       56 or $self->wail( q{Attribute 'name' is required} );
62              
63             defined $self->{parent}
64 17 50       58 or $self->wail( q{Attribute 'parent' is required} );
65 17 50       76 instance( $self->{parent}, 'Astro::App::Satpass2' )
66             or $self->wail( q{Attribute 'parent' must be an Astro::App::Satpass2} );
67 17         56 weaken( $self->{parent} );
68              
69 17         93 return;
70             }
71              
72             sub name {
73 25     25 1 52 my ( $self ) = @_;
74 25         87 return $self->{name};
75             }
76              
77             sub parent {
78 28     28 1 58 my ( $self ) = @_;
79 28         86 return $self->{parent};
80             }
81              
82             sub wail {
83 1     1 1 4 my ( $self, @args ) = @_;
84 1         8 $self->warner()->wail( @args );
85 0         0 return; # wail() dies, but Perl::Critic does not know this.
86             }
87              
88             sub warner {
89 1     1 1 3 my ( $self ) = @_;
90 1 50       4 ref $self
91             or return Astro::App::Satpass2::Warner->new();
92 1         8 return $self->{warner};
93             }
94              
95             sub weep {
96 0     0 1   my ( $self, @args ) = @_;
97 0           $self->warner()->weep( @args );
98 0           return; # weep() dies, but Perl::Critic does not know this.
99             }
100              
101             sub whinge {
102 0     0 1   my ( $self, @args ) = @_;
103 0           $self->warner()->whinge( @args );
104 0           return;
105             }
106              
107             # TODO get rid of this when level1 support goes away.
108             sub __level1_rewrite {
109 0     0     return;
110             }
111              
112             1;
113              
114             __END__