App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/Config.pm view on Meta::CPAN
#! perl
package main;
our $options;
our $config;
package ChordPro::Config;
use v5.26;
use utf8;
use Carp;
use feature qw( signatures state );
no warnings "experimental::signatures";
use ChordPro;
use ChordPro::Files;
use ChordPro::Paths;
use ChordPro::Utils;
use ChordPro::Utils qw( enumerated );
use Scalar::Util qw(reftype);
use List::Util qw(any);
use Storable 'dclone';
use Hash::Util;
use Ref::Util qw( is_arrayref is_hashref );
#sub hmerge($$;$);
#sub clone($);
#sub default_config();
sub new ( $pkg, $cf = {} ) {
bless $cf => $pkg;
}
sub pristine_config {
use ChordPro::Config::Data;
__PACKAGE__->new(ChordPro::Config::Data::config());
}
sub configurator ( $opts = undef ) {
# Test programs call configurator without options.
# Prepare a minimal config.
unless ( $opts ) {
my $cfg = pristine_config();
$config = $cfg;
$cfg->split_fc_aliases;
$options = { verbose => 0 };
process_config( $cfg, "<builtin>" );
$cfg->{settings}->{lineinfo} = 0;
return $cfg;
}
if ( keys(%$opts) ) {
$options = { %{$options//{}}, %$opts };
}
my @cfg;
my $verbose = $options->{verbose} //= 0;
# Load defaults.
warn("Reading: <builtin>\n") if $verbose > 1;
my $cfg = pristine_config();
# Default first.
@cfg = prep_configs( $cfg, "<builtin>" );
# Bubble default config to be the first.
unshift( @cfg, pop(@cfg) ) if @cfg > 1;
# Collect other config files.
my $add_config = sub {
my $fn = shift;
$cfg = get_config( $fn );
push( @cfg, $cfg->prep_configs($fn) );
};
foreach my $c ( qw( sysconfig userconfig config ) ) {
next if $options->{"no$c"};
if ( ref($options->{$c}) eq 'ARRAY' ) {
$add_config->($_) foreach @{ $options->{$c} };
}
else {
warn("Adding config for $c\n") if $verbose;
$add_config->( $options->{$c} );
}
}
( run in 2.974 seconds using v1.01-cache-2.11-cpan-524268b4103 )