Config-Scoped
view release on metacpan or search on metacpan
lib/Config/Scoped.pm view on Meta::CPAN
unless ( File::Spec->file_name_is_absolute($include_file) ) {
$include_file = File::Spec->catfile( $parent_cfg_dir, $include_file )
or Config::Scoped::Error->throw(
-file => $parent_cfg_file,
-line => $thisparser->_get_line(%args),
-text => "error in catfile for '$include_file'"
);
}
# Create a new parser for this include file parsing.
# Use the current parser states (perhaps already localized
# in a grammar { action }), and change some args for the new
# include parser creation.
#
my $clone_parser =
( ref $thisparser )
->new( %{ $thisparser->{local} }, file => $include_file )
or Config::Scoped::Error->throw(
-file => $parent_cfg_file,
-line => $thisparser->_get_line(%args),
-text => "Internal error: Can't create a clone parser"
);
# parse the include file (recursively) and return to the parent
# cfg parse. Loop includes are detected (via md5) and throws an exception.
return $clone_parser->parse(
parent_file => $parent_cfg_file, # for better error reporting
);
}
# this method is called as an action in the MACRO rule in order
# to store the macro in the macros hash
sub _store_macro {
my $thisparser = shift;
my %args = @_;
Config::Scoped::Error->throw(
-text => Carp::shortmess("missing parameters") )
unless ( defined $args{name} && defined $args{value} );
# macro validation, may be overwritten by the application
my $valid_macro = $thisparser->macro_validate(%args);
return $thisparser->{local}{macros}{ $args{name} } = $valid_macro;
}
sub macro_validate {
my $thisparser = shift;
my %args = @_;
Config::Scoped::Error->throw(
-text => Carp::shortmess("missing parameters") )
unless ( defined $args{name} && defined $args{value} );
my $name = $args{name};
my $value = $args{value};
# warnings for macros enabled?
if ( $thisparser->warnings_on( name => 'macro', ) ) {
Config::Scoped::Error::Validate::Macro->throw(
-file => $thisparser->_get_file(%args),
-line => $thisparser->_get_line(%args),
-text => "macro redefinition for '$name"
)
if exists $thisparser->{local}{macros}{$name};
}
# return unchanged, subclass methods may do it different
return $value;
}
# macro expansion
sub _expand_macro {
my $thisparser = shift;
my %args = @_;
Config::Scoped::Error->throw(
-text => Carp::shortmess("missing parameters") )
unless defined $args{value};
my $value = $args{value};
while ( my ( $macro, $defn ) = each %{ $thisparser->{local}{macros} } ) {
$value =~ s/\Q$macro\E/$defn/g;
}
# a P::RD rule can't return undef, then the rule will fail
return defined $value ? $value : '';
}
# parameter storage, called as action from within the grammar
sub _store_parameter {
my $thisparser = shift;
my %args = @_;
Config::Scoped::Error->throw(
-text => Carp::shortmess("missing parameters") )
unless ( defined $args{value} && defined $args{name} );
$args{name} = lc( $args{name} ) if $thisparser->{local}{lc};
# parameter validation, may be overwritten by the application
my $valid_value = $thisparser->parameter_validate(%args);
# store the return value in the params hash
return $thisparser->{local}{params}{ $args{name} } = $valid_value;
}
sub parameter_validate {
my $thisparser = shift;
my %args = @_;
Config::Scoped::Error->throw(
-text => Carp::shortmess("missing parameters") )
unless ( defined $args{value} && defined $args{name} );
# warnings for parameters enabled?
if ( $thisparser->warnings_on( name => 'parameter', ) ) {
Config::Scoped::Error::Validate::Parameter->throw(
-file => $thisparser->_get_file(%args),
( run in 1.191 second using v1.01-cache-2.11-cpan-5837b0d9d2c )