package Enbld::App::Configuration; use strict; use warnings; use File::Spec; use autodie; use Carp; our $envname = 'myenv'; our $config_ref; our $rcfile_ref; our $CONFIGURATIONFILE; our $dirty; sub is_dirty { return $dirty; } sub config { return $config_ref; } sub rcfile { return $rcfile_ref; } # method for only test. sub destroy { undef $CONFIGURATIONFILE; undef $envname; undef $dirty; undef $config_ref; undef $rcfile_ref; } sub _configuration_file_path { require Enbld::Home; return File::Spec->catfile( Enbld::Home->conf, 'enbld.conf' ); } sub read_file { my $pkg = shift; my $path = _configuration_file_path(); return if ( ! -e $path ); open my $fh, '<', $path; my $str = do { local $/; <$fh> }; close $fh; eval $str; $envname = $CONFIGURATIONFILE->{envname}; require Enbld::Config; foreach my $name ( keys %{ $CONFIGURATIONFILE->{config} } ) { $config_ref->{$name} = Enbld::Config->new( %{ $CONFIGURATIONFILE->{config}{$name} } ); } require Enbld::RcFile; foreach my $filename ( keys %{ $CONFIGURATIONFILE->{rcfile} } ) { $rcfile_ref->{$filename} = Enbld::RcFile->new( %{ $CONFIGURATIONFILE->{rcfile}{$filename} }); } return $envname; } sub write_file { require Enbld::Feature; return if Enbld::Feature->is_deploy_mode; return unless is_dirty(); $CONFIGURATIONFILE = { envname => $envname, config => {}, rcfile => {}, format => 'v2.0', # for future...configuration format version. }; foreach my $name ( keys %{ $config_ref } ) { $CONFIGURATIONFILE->{config}{$name} = $config_ref->{$name}->serialize; } foreach my $filename ( keys %{ $rcfile_ref } ) { $CONFIGURATIONFILE->{rcfile}{$filename} = $rcfile_ref->{$filename}->serialize; } my $path = _configuration_file_path(); require Data::Dumper; open my $fh, '>', $path; my $dump = Data::Dumper->new( [ $CONFIGURATIONFILE ], [ 'Enbld::App::Configuration::CONFIGURATIONFILE' ] ); print $fh $dump->Dump; close $fh; return $envname; } sub set_config { my ( $pkg, $config ) = @_; my $name = $config->name; $config_ref->{$name} = $config; $dirty++; return $config->name; } sub set_rcfile { my ( $pkg, $rcfile ) = @_; my $filename = $rcfile->filename; $rcfile_ref->{$filename} = $rcfile; $dirty++; return $rcfile->filename; } sub search_config { my ( $pkg, $name ) = @_; return $config_ref->{$name} if ( exists $config_ref->{$name} ); return; } sub search_rcfile { my ( $pkg, $filename ) = @_; return $rcfile_ref->{$filename} if ( exists $rcfile_ref->{$filename} ); return; } sub envname { return $envname; } sub set_envname { my ( $pkg, $name ) = @_; $envname = $name; return $envname; } 1;