Perl Moose - загрузка значений из файла конфигурации и т. Д. - PullRequest
3 голосов
/ 20 марта 2012

Я новичок в использовании Moose, но мне было интересно, как я могу загрузить значения из файла конфигурации, а затем выставить эти значения в качестве свойств моего объекта 'config', где атрибуты являются именами конфигурации в файле конфигурации.

Например, файл конфигурации может содержать:

server:mozilla.org
protocol:HTTP

Поэтому я бы хотел, чтобы у моего объекта конфигурации был атрибут 'server' со значением 'mozilla.org' и протоколатрибут со значением «HTTP».

Сейчас я понимаю, что я должен явно назвать атрибуты с типом записи

has 'server'  => ( is => 'ro', isa => 'Str', default => 'mozilla.org' );

в моем файле Config.pm.

Как создать их динамически, чтобы файл конфигурации мог изменяться, не заставляя меня перезаписывать Config.pm каждый раз, когда это происходит?

TIA!

Ответы [ 2 ]

7 голосов
/ 20 марта 2012

Это такая очевидная идея, она была реализована уже несколько раз.

Также см.

какие параметры командной строки сопоставляются с атрибутами, которые вам, скорее всего, также нужны.

2 голосов
/ 20 марта 2012

Это не совсем то, что вы просили, но вы можете получить атрибут config, который является ссылкой на хеш, используя BUILDARGS для заполнения информации конфигурации во время создания. Предполагая, что строки вашего конфигурационного файла состоят из пар ключ-значение, разделенных :, что-то вроде этого должно работать:

package My::Module;
use Moose;

has 'config'=>(isa=>'HashRef[Str]',is=>'rw',required=>1);

around BUILDARGS=>sub
{
  my $orig=shift;
  my $class=shift;
  my $args=shift; #other arguments passed in (if any).

  my %config_hash=();
  open(my $read,"<","config_file") or confess $!;
  while(<$read>)
  {
    chomp;
    my @array=split /:/;
    $config_hash{$array[0]}=$array[1];
  }
  close($read);

  $args->{config}=\%config_hash;

  return $class->$orig($args);
};

no Moose;
1;

С минимальными усилиями также легко иметь дополнительные атрибуты для указания имени и пути файла конфигурации вместе с разделителем. Они могут быть доступны внутри BUILDARGS как, например, $args->{config_file} и $args->{config_delimiter}.

...