CGI::Application::Plugin::Config::YAMLつづき

Config::YAMLをつかってるので、
他のメソッドも扱えるように実装してみた。
AUTOLOADについては省きました。


package CGI::Application::Plugin::Config::YAML;
use strict;
use warnings;
use vars qw($VERSION @EXPORT);
use CGI::Application;
use Config::YAML;
$VERSION = '0.01';
@EXPORT = qw(
config_file
config_param
config
config_fold
config_read
);
sub import {
my $pkg = shift;
my $call = caller;
no strict 'refs';
foreach my $sym (@EXPORT) {
*{"${call}::$sym"} = \&{$sym};
}
}
sub config_file {
my $self = shift;
my $file_name = shift;
if ( defined $file_name ) {
$self->{__CONFIG_YAML}->{__FILE_NAME} = $file_name;
$self->{__CONFIG_YAML}->{__FILE_CHANGED} = 1;
}
else {
$file_name = $self->{__CONFIG_YAML}->{__FILE_NAME};
}
if ( ! defined $file_name ) {
$ENV{CGIAPP_CONFIG_FILE} =~ /(.*)/;
$file_name = $1;
}
$file_name;
}
sub config_param {
my $self = shift;
my @params = @_;
my $conf = $self->config();
if ( scalar(@params) == 0 ) {
return;
}
elsif ( scalar(@params) == 1 ) {
return $conf->get($params[0]);
}
else {
my %params = (@params);
$conf->set($_ => $params{$_}) foreach (keys %params);
if ( $conf->write ) {
return;
}
else{
die "Config-Plugin: Could not write to config file (" . $self->config_file . ")! ";
}
}
}
sub config_fold {
my ($self, $data) = @_;
my $conf = $self->config();
$conf->fold($data);
return;
}
sub config_read {
my ($self, $file) = @_;
my $conf = $self->config();
$conf->read($file);
return;
}
sub config {
my $self = shift;
my $create = !$self->{__CONFIG_YAML}->{__CONFIG_OBJ} || $self->{__CONFIG_YAML}->{__FILE_CHANGED};
if ( $create ) {
my $file_name = $self->config_file or die "No config file specified!";
my $conf;
eval{
$conf = Config::YAML->new(config => $file_name);
};
die "Could not create Config::YAML object for file $file_name! $@" if $@;
$self->{__CONFIG_YAML}->{__CONFIG_OBJ} = $conf;
$self->{__CONFIG_YAML}->{__FILE_CHANGED} = 0;
}
return $self->{__CONFIG_YAML}->{__CONFIG_OBJ};
}
1;

こんな感じでどうでしょうか?
使い方はこんなの(適当に抜粋)


sub cgiapp_init {
my $self = shift;
$self->config_file('neko.yml');
}
sub do_test{
my $self = shift;
my $name = $self->config_param('name');
my $age = $self->config_param('age');
my $weight = $self->config_param('weight');
$self->config_param(name => 'nekokak');
my $name2 = $self->config_param('name');
my %data = (job => 'SE',pay => '1000000');
$self->config_fold(\%data);
my $job = $self->config_param('job');
my $pay = $self->config_param('pay');
$self->config_read('./test.yml');
my $day = $self->config_param('day');
my $time = $self->config_param('time');
my $html = <<"__HTML__";
<html><head></head><body>
name:$name<br>
age:$age<br>
weight:$weight<br>
name2:$name2<br>
job:$job<br>
pay:$pay<br>
day:$day<br>
time:$time<br>
</body></html>
__HTML__
return $html;
}

説明手抜きですみません^^;