The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

package config;
use 5.008001;
use strict;
our $VERSION = "1.4.4";
use constant {};
our %_CONFIG;
# Конфигурирует модуль. Должен использоваться в .config.pm
sub config($%) {
my $pkg = shift;
$_CONFIG{$pkg} = {@_};
return;
}
# Конфигурирует модуль. Должен использоваться в .config.pm
#@deprecated
sub config_module($$) {
my ($pkg, $constants) = @_;
$_CONFIG{$pkg} = $constants;
return;
}
# Проект всегда старует от корня своей директории, где и должен лежать модуль
require "./.config.pm" if -e "./.config.pm";
# Импортирует конфиг-константы
sub import {
my ($cls, $name, $value) = @_;
return if !defined $name;
my $hash = ref $name eq "HASH"? $name: +{($name => $value)};
my $pkg = caller;
if(!$^V or $^V lt 5.22.0) {
no strict 'refs';
for(keys %$hash) {
my $val = exists $_CONFIG{$pkg} && exists $_CONFIG{$pkg}{$_}? $_CONFIG{$pkg}{$_}: $hash->{$_};
*{"${pkg}::$_"} = sub {$val};
}
} else {
constant->import("${pkg}::$_", exists $_CONFIG{$pkg} && exists $_CONFIG{$pkg}{$_}? $_CONFIG{$pkg}{$_}: $hash->{$_}) for keys %$hash;
}
}
1;
__END__
=encoding utf-8
=head1 NAME
config - Perl module constant configurator
=head1 VERSION
1.4.4
=head1 SYNOPSIS
lib/Weapons.pm file:
package Weapons;
use config DAGGER => "mizericordia";
1;
.config.pm file:
package config;
config Weapons => (
DAGGER => "horn",
);
1;
What should happen:
use lib 'lib';
use Weapons;
Weapons::DAGGER # => horn
=head1 DESCRIPTION
C<use config> creates a constant in the same way as C<use constant>, but takes the value from the project's local config file if one is specified there.
The config file B<./.config.pm> is located in the root directory of the project.
The current directory in the project must correspond to the project root.
Since the C<config.pm> pragma module is overridden on <metacpan.org> by the C<config.pod> file from the C<WordNet-Similarity> package, this manual is used ([config::Manual](blob/master/lib/config/ Manual.md)).
=head1 AUTHOR
Yaroslav O. Kosmina L<mailto:dart@cpan.org>
=head1 LICENSE
⚖ B<Perl5>
=head1 COPYRIGHT
The config module is copyright (c) 2023 Yaroslav O. Kosmina. Rusland. All rights reserved.