The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;