Config-Model
view release on metacpan or search on metacpan
lib/Config/Model/ValueComputer.pm view on Meta::CPAN
#
# This file is part of Config-Model
#
# This software is Copyright (c) 2005-2022 by Dominique Dumont.
#
# This is free software, licensed under:
#
# The GNU Lesser General Public License, Version 2.1, February 1999
#
package Config::Model::ValueComputer 2.162;
use Mouse;
use MouseX::StrictConstructor;
# use Scalar::Util qw(weaken) ;
use Carp;
use Parse::RecDescent 1.90.0;
use Data::Dumper ();
use Log::Log4perl qw(get_logger :levels);
use vars qw($compute_grammar $compute_parser);
use feature qw/postderef signatures/;
no warnings qw/experimental::postderef experimental::signatures/;
my $logger = get_logger("ValueComputer");
# allow_override is intercepted and handled by Value object
has formula => ( is => 'ro', isa => 'Str', required => 1 );
has value_type => ( is => 'ro', isa => 'Str', required => 1 );
# value_object is mostly used for error messages
has value_object => (
is => 'ro',
isa => 'Config::Model::AnyThing',
required => 1,
weak_ref => 1,
handles => [qw/grab grab_value location index element/],
);
has variables => ( is => 'ro', isa => 'HashRef', default => sub { {} } );
has replace => ( is => 'ro', isa => 'HashRef', default => sub { {} } );
has [qw/use_eval allow_override use_as_upstream_default/] =>
( is => 'ro', isa => 'Bool', default => 0 );
has allow_user_override => (
is => 'ro',
isa => 'Bool',
lazy => 1,
builder =>
sub { my $self = shift; return $self->allow_override || $self->use_as_upstream_default; } );
has need_quote => ( is => 'ro', isa => 'Bool', builder => '_need_quote', lazy => 1 );
sub _need_quote {
my $self = shift;
my $need_quote = 0;
$need_quote = 1 if $self->{use_eval} and $self->{value_type} !~ /(integer|number|boolean)/;
return $need_quote;
}
has undef_is => ( is => 'ro', isa => 'Maybe[Str]' );
has undef_replacement => (
is => 'ro',
isa => 'Maybe[Str]',
builder => '_build_undef_replacement',
lazy => 1
);
sub _build_undef_replacement {
my $self = shift;
my $sui = $self->undef_is;
return defined $sui && $sui eq "''" ? ''
: defined $sui ? $sui
: undef;
}
sub BUILD {
my $self = shift;
# create parser if needed
$compute_parser ||= Parse::RecDescent->new($compute_grammar);
$logger->trace("called with formula: $self->{formula}");
# must make a first pass at computation to subsitute index and
# element values. leaves $xxx outside of &index or &element untouched
my $result_r =
$compute_parser->pre_compute( $self->{formula}, 1, $self->{value_object},
$self->{variables}, $self->{replace}, 'yes', $self->need_quote, );
$logger->trace("pre_formula: ". ($result_r ? $$result_r : ' pre_compute failed, using original formula'));
$self->{pre_formula} = $result_r ? $$result_r : $self->{formula};
return;
}
sub compute ($self, %args) {
my $check = $args{check} || 'yes';
( run in 0.494 second using v1.01-cache-2.11-cpan-39bf76dae61 )