File Coverage

blib/lib/Footprintless/Factory.pm
Criterion Covered Total %
statement 79 83 95.1
branch 13 14 92.8
condition n/a
subroutine 22 23 95.6
pod 15 15 100.0
total 129 135 95.5


line stmt bran cond sub pod time code
1 14     14   68551 use strict;
  14         35  
  14         401  
2 14     14   69 use warnings;
  14         24  
  14         590  
3              
4             package Footprintless::Factory;
5             $Footprintless::Factory::VERSION = '1.26';
6             # ABSTRACT: The default factory for footprintless modules
7             # PODNAME: Footprintless::Factory
8              
9 14     14   76 use Carp;
  14         27  
  14         868  
10 14     14   326 use Footprintless::Util;
  14         25  
  14         410  
11 14     14   68 use Log::Any;
  14         21  
  14         112  
12              
13             our $AUTOLOAD;
14             my $logger = Log::Any->get_logger();
15              
16             sub new {
17 50     50 1 213 return bless( {}, shift )->_init(@_);
18             }
19              
20             sub agent {
21 11     11 1 32 my ( $self, @options ) = @_;
22              
23 11         55 return Footprintless::Util::agent(@options);
24             }
25              
26             sub AUTOLOAD {
27 4     4   9 my ( $self, @args ) = @_;
28 4         6 my $method_name = $AUTOLOAD;
29 4         11 $method_name =~ s/.*:://;
30 4         9 foreach my $plugin ( $self->plugins() ) {
31 4         9 my $method = $plugin->factory_methods()->{$method_name};
32 4 50       44 if ($method) {
33 4         8 return &$method( $self, @args );
34             }
35             }
36 0         0 croak("unsupported factory method: [$method_name]");
37             }
38              
39             sub command_options {
40 33     33 1 743 my ( $self, @spec ) = @_;
41 33         125 return $self->command_options_factory()->command_options(@spec);
42             }
43              
44             sub command_options_factory {
45 33     33 1 74 my ($self) = @_;
46              
47 33 100       165 unless ( $self->{command_options_factory} ) {
48 22         1559 require Footprintless::CommandOptionsFactory;
49             $self->{command_options_factory} =
50 22         87 Footprintless::CommandOptionsFactory->new( localhost => $self->localhost() );
51             }
52              
53 33         147 return $self->{command_options_factory};
54             }
55              
56             sub command_runner {
57 39     39 1 84 my ($self) = @_;
58              
59 39 100       99 unless ( $self->{command_runner} ) {
60 11         80 require Footprintless::Util;
61 11         160 $self->{command_runner} = Footprintless::Util::default_command_runner();
62             }
63              
64 39         218 return $self->{command_runner};
65             }
66              
67             sub deployment {
68 2     2 1 6 my ( $self, $coordinate, %options ) = @_;
69              
70 2         316 require Footprintless::Deployment;
71 2         16 return Footprintless::Deployment->new( $self, $coordinate, %options );
72             }
73              
74       15     sub DESTROY { }
75              
76             sub entities {
77 288     288 1 1600 return $_[0]->{entities};
78             }
79              
80             sub _init {
81 50     50   163 my ( $self, $entities, %options ) = @_;
82              
83 50         179 $self->{entities} = $entities;
84 50         133 $self->{agent} = $options{agent};
85 50         120 $self->{command_options_factory} = $options{command_options_factory};
86 50         120 $self->{command_runner} = $options{command_runner};
87 50         104 $self->{localhost} = $options{localhost};
88 50         103 $self->{resource_manager} = $options{resource_manager};
89              
90 50         109 $self->{plugins} = [];
91 50 100       177 if ( $self->{entities}{'footprintless'} ) {
92 12         24 my $plugin_modules = $self->{entities}{'footprintless'}{plugins};
93 12 100       29 if ($plugin_modules) {
94 2         4 foreach my $plugin_module (@$plugin_modules) {
95 2         6 $logger->debugf( 'registering plugin %s', $plugin_module );
96             $self->register_plugin(
97             Footprintless::Util::dynamic_module_new(
98 2         20 $plugin_module, $self->{entities}{'footprintless'}{$plugin_module}
99             )
100             );
101             }
102             }
103             }
104              
105 50         150 return $self;
106             }
107              
108             sub localhost {
109 38     38 1 110 my ($self) = @_;
110              
111 38 100       151 unless ( $self->{localhost} ) {
112 28         590 require Footprintless::Localhost;
113 28         201 $self->{localhost} = Footprintless::Localhost->new()->load_all();
114             }
115              
116 38         253 return $self->{localhost};
117             }
118              
119             sub log {
120 4     4 1 8 my ( $self, $coordinate, %options ) = @_;
121              
122 4         316 require Footprintless::Log;
123 4         21 return Footprintless::Log->new( $self, $coordinate, %options );
124             }
125              
126             sub overlay {
127 2     2 1 6 my ( $self, $coordinate, %options ) = @_;
128              
129 2         298 require Footprintless::Overlay;
130 2         29 return Footprintless::Overlay->new( $self, $coordinate, %options );
131             }
132              
133             sub plugins {
134 12     12 1 18 return @{ $_[0]->{plugins} };
  12         39  
135             }
136              
137             sub register_plugin {
138 2     2 1 4 my ( $self, $plugin ) = @_;
139              
140 2         3 push( @{ $self->{plugins} }, $plugin );
  2         7  
141             }
142              
143             sub resource_manager {
144 19     19 1 62 my ( $self, $coordinate, %options ) = @_;
145              
146 19 100       98 unless ( $self->{resource_manager} ) {
147             $self->{resource_manager} =
148 9         69 Footprintless::Util::dynamic_module_new( 'Footprintless::ResourceManager',
149             $self, $coordinate );
150             }
151              
152 19         114 return $self->{resource_manager};
153             }
154              
155             sub service {
156 4     4 1 9 my ( $self, $coordinate, %options ) = @_;
157              
158 4         303 require Footprintless::Service;
159 4         27 return Footprintless::Service->new( $self, $coordinate, %options );
160             }
161              
162             sub tunnel {
163 0     0 1   my ( $self, $coordinate, %options ) = @_;
164              
165 0           require Footprintless::Tunnel;
166 0           return Footprintless::Tunnel->new( $self, $coordinate, %options );
167             }
168              
169             1;
170              
171             __END__