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   11774 use 5.008;
  20         113  
4              
5 20     20   164 use strict;
  20         42  
  20         628  
6 20     20   98 use warnings;
  20         81  
  20         1328  
7              
8 20         3074 use Astro::App::Satpass2::Utils qw{
9             instance
10             CODE_REF
11             @CARP_NOT
12 20     20   167 };
  20         36  
13 20     20   6863 use Astro::App::Satpass2::Warner;
  20         59  
  20         1009  
14 20     20   131 use Scalar::Util 1.26 qw{ weaken };
  20         365  
  20         16937  
15              
16             our $VERSION = '0.057_01';
17              
18             sub new {
19 17     17 1 204 my ( $class, %arg ) = @_;
20 17   33     107 my $self = bless \%arg, ref $class || $class;
21 17         109 $self->init();
22 16         104 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 33 my ( $self, @args ) = @_;
32             $self->{generate}
33 9 50       33 or $self->weep( q{'generate' attribute not specified} );
34             @args
35 9 50       27 or return $self->{generate}->( $self, sort $self->implements() );
36 9         25 foreach my $macro ( @args ) {
37 9         41 $self->implements( $macro, required => 1 );
38             }
39 9         41 return $self->{generate}->( $self, @args );
40             }
41              
42             sub implements {
43 28     28 1 107 my ( $self, $name, %arg ) = @_;
44             defined $name
45 28 50       79 or return ( keys %{ $self->{implements} } );
  0         0  
46             $self->{implements}{$name}
47             or not $arg{required}
48 28 50 33     130 or $self->wail( "This object does not implement macro $name" );
49 28         109 return $self->{implements}{$name};
50             }
51              
52             sub init {
53 17     17 1 94 my ( $self ) = @_;
54 17   33     84 $self->{warner} ||= Astro::App::Satpass2::Warner->new();
55              
56             defined $self->{generate}
57             and CODE_REF ne ref $self->{generate}
58 17 50 33     120 and $self->wail( q{If specified, 'generate' must be a code ref} );
59              
60             defined $self->{name}
61 17 50       57 or $self->wail( q{Attribute 'name' is required} );
62              
63             defined $self->{parent}
64 17 50       51 or $self->wail( q{Attribute 'parent' is required} );
65 17 50       74 instance( $self->{parent}, 'Astro::App::Satpass2' )
66             or $self->wail( q{Attribute 'parent' must be an Astro::App::Satpass2} );
67 17         78 weaken( $self->{parent} );
68              
69 17         40 return;
70             }
71              
72             sub name {
73 25     25 1 58 my ( $self ) = @_;
74 25         87 return $self->{name};
75             }
76              
77             sub parent {
78 28     28 1 68 my ( $self ) = @_;
79 28         82 return $self->{parent};
80             }
81              
82             sub wail {
83 1     1 1 4 my ( $self, @args ) = @_;
84 1         6 $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 2 my ( $self ) = @_;
90 1 50       4 ref $self
91             or return Astro::App::Satpass2::Warner->new();
92 1         9 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__