@@ -49,12 +49,10 @@ sub new {
49
49
my $self = bless {}, $self_class ;
50
50
51
51
$self -> {dirs } = $params {dirs } || [' .' ];
52
- $self -> {interpolation }
53
- = exists $params {interpolation } ? $params {interpolation } : 1;
54
- $self -> {processing_directives }
55
- = exists $params {processing_directives }
56
- ? $params {processing_directives }
57
- : 1;
52
+ $self -> {interpolate_variables } = exists $params {interpolate_variables }
53
+ ? $params {interpolate_variables } : 1;
54
+ $self -> {process_directives } = exists $params {process_directives }
55
+ ? $params {process_directives } : 1;
58
56
59
57
$self -> {_hash_merge } = Hash::Merge-> new( ' CONFIG_PRECEDENT' );
60
58
$self -> {_config } = undef ;
@@ -63,6 +61,22 @@ sub new {
63
61
return $self ;
64
62
}
65
63
64
+ {
65
+ no strict ' refs' ;
66
+
67
+ foreach my $name ( qw( interpolate_variables process_directives ) ) {
68
+ *{$name } = sub {
69
+ my $self = shift ;
70
+
71
+ if ( @_ ) {
72
+ $self -> {$name } = shift ;
73
+ }
74
+
75
+ return $self -> {$name };
76
+ }
77
+ }
78
+ }
79
+
66
80
sub load {
67
81
my $self = shift ;
68
82
my @config_sections = @_ ;
@@ -140,7 +154,7 @@ sub _build_tree {
140
154
141
155
if ( @not_found ) {
142
156
croak " Can't locate " . join ( ' , ' , @not_found )
143
- . " in directories: " . join ( ' , ' , @{ $self -> {dirs } } );
157
+ . " in " . join ( ' , ' , @{ $self -> {dirs } } );
144
158
}
145
159
}
146
160
}
@@ -172,25 +186,28 @@ sub _process_node {
172
186
173
187
return unless defined $node ;
174
188
175
- if ( ref ($node ) eq ' HASH' && $self -> {processing_directives } ) {
176
- if ( defined $node -> {' var' } ) {
189
+ if ( ref ($node ) eq ' HASH' && $self -> {process_directives } ) {
190
+ if ( defined $node -> {var } ) {
177
191
$node = $self -> _resolve_var( $node -> {var } );
178
192
}
179
193
elsif ( defined $node -> {include } ) {
180
194
$node = $self -> _build_tree( $node -> {include } );
181
195
}
182
- elsif ( defined $node -> {underlay } ) {
183
- my $layer = delete $node -> {underlay };
184
- $layer = $self -> _process_layer($layer );
185
- $node = $self -> {_hash_merge }-> merge( $layer , $node );
186
- }
187
- elsif ( defined $node -> {overlay } ) {
188
- my $layer = delete $node -> {overlay };
189
- $layer = $self -> _process_layer($layer );
190
- $node = $self -> {_hash_merge }-> merge( $node , $layer );
196
+ else {
197
+ if ( defined $node -> {underlay } ) {
198
+ my $layer = delete $node -> {underlay };
199
+ $layer = $self -> _process_layer($layer );
200
+ $node = $self -> {_hash_merge }-> merge( $layer , $node );
201
+ }
202
+
203
+ if ( defined $node -> {overlay } ) {
204
+ my $layer = delete $node -> {overlay };
205
+ $layer = $self -> _process_layer($layer );
206
+ $node = $self -> {_hash_merge }-> merge( $node , $layer );
207
+ }
191
208
}
192
209
}
193
- elsif ( $self -> {interpolation } ) { # SCALAR
210
+ elsif ( $self -> {interpolate_variables } ) { # SCALAR
194
211
$node =~ s /\$ ((\$ ?)\{ ([^\} ]*)\} )/
195
212
$2 ? $1 : $self ->_resolve_var( $3 )/ ge ;
196
213
}
@@ -250,7 +267,7 @@ sub _resolve_var {
250
267
else { # ARRAY
251
268
if ( $token =~ m /\D / ) {
252
269
die " Argument \" $token \" isn't numeric in array element:"
253
- . " \$ { $ var_name} \n " ;
270
+ . " $ var_name\n " ;
254
271
}
255
272
256
273
last unless defined $pointer -> [$token ];
@@ -270,6 +287,10 @@ sub _resolve_var {
270
287
}
271
288
}
272
289
290
+ unless ( defined $vars -> {$var_name } ) {
291
+ $vars -> {$var_name } = ' ' ;
292
+ }
293
+
273
294
return $vars -> {$var_name };
274
295
}
275
296
@@ -291,6 +312,10 @@ and variables interpolation support
291
312
292
313
=head2 load()
293
314
315
+ =head2 interpolate_variables
316
+
317
+ =head2 process_directives
318
+
294
319
=head1 AUTHOR
295
320
296
321
Eugene Ponizovsky, E<lt> [email protected] E<gt>
0 commit comments