package XML::Comma::Pkg::ModuleConfiguration;
use strict;
use warnings;
{
my $config;
sub get {
my ( $class, $m ) = @_;
# fill the private config hash if we haven't already
$config->{$class} ||= $class->make_config();
return $config->{$class}->{$m};
}
sub dump {
my ( $class ) = shift;
$config->{$class} ||= $class->make_config();
foreach my $key ( keys %{$config->{$class}} ) {
print "$key --> " . $config->{$class}->{$key} . "\n";
}
}
#only privileged code should ever call this. right now the only
#use is for appending architecture to XML::Comma->sys_directory()
sub _set {
my ( $class, $m, $v ) = @_;
$config->{$class}->{$m} = $v;
}
}
sub make_config {
my $class = shift();
my $fh = $class->get_data_filehandle();
# use a join rather than local'ing $/ so that line numbers are
# counted (for error reporting). it might also be possible to set
# the input line number to some guessed-at offset, to help error
# line numbers be close to what they should be.
my $block = join ( '', <$fh> );
my $config = eval "{ $block }";
if ( $@ ) {
my $err = $@;
die "eval err: $err\n";
}
return $config;
}
sub get_data_filehandle {
no strict "refs";
my $class = shift;
my $fh_name = "$class" . '::DATA';
#print "fhname: $fh_name\n";
return *{$fh_name};
}
1;