OSDN Git Service

cleanup Keitairc::Config
authorISHIKAWA Mutsumi <ishikawa@hanzubon.jp>
Thu, 24 Jun 2010 17:08:24 +0000 (02:08 +0900)
committerISHIKAWA Mutsumi <ishikawa@hanzubon.jp>
Thu, 24 Jun 2010 17:08:24 +0000 (02:08 +0900)
lib/Keitairc/Config.pm

index 030eac5..088e029 100644 (file)
@@ -2,6 +2,7 @@
 # Keitairc::Config
 #
 # Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
+# Copyright (c) 2010 ISHIKAWA Mutsumi <ishikawa@hanzubon.jp>
 # This program is covered by the GNU General Public License 2
 
 package Keitairc::Config;
@@ -27,11 +28,11 @@ sub new{
 
        $me->define(
                # required
-               'irc_nick',
-               'irc_username',
-               'irc_server',
-               'web_password',
-               'web_host',
+               'irc_nick' => {ATTR => 'RO|REQ'},
+               'irc_username' => {ATTR => 'RO|REQ'},
+               'irc_server'  => {ATTR => 'RO|REQ'},
+               'web_password'  => {ATTR => 'RO|REQ'},
+               'web_host' => {ATTR => 'RO|REQ'},
 
                # optional
                'irc_password',
@@ -42,7 +43,7 @@ sub new{
                'softbank_serial_key' => {DEFAULT => ''},
                'emobile_userid' => {DEFAULT => ''},
                'irc_keyword',
-               'web_listen_port',
+               'web_listen_port' => {ATTR => 'RO'},
                'web_title' => {DEFAULT => 'keitairc'},
                'common_header' => {DEFAULT => '
 <meta name="Robots" content="noindex,nofollow" />
@@ -51,54 +52,54 @@ sub new{
 <meta http-equiv="cache-control" content="no-cache" />
 <meta http-equiv="expires" content="-1" />'},
                'extra_header' => {DEFAULT => ''},
-               'silent_config' => {DEFAULT => $arg->{silent}},
+               'silent_config' => {DEFAULT => $arg->{silent}, ATTR => 'RO'},
                'version' => {DEFAULT => $arg->{version}},
-               'template_dir'  => {DEFAULT => getcwd() . '/data/templates:__KEITAIRC_DATA_DIR__/templates'},
-               'plugin_dir' => {DEFAULT => getcwd() . '/data/plugins:__KEITAIRC_DATA_DIR__/plugins'},
-               'public_dir' => {DEFAULT => getcwd() . '/data/public:__KEITAIRC_DATA_DIR__/public'},
+               'template_dir'  => {DEFAULT => getcwd() . '/data/templates:__KEITAIRC_DATA_DIR__/templates', ATTR => 'RO'},
+               'plugin_dir' => {DEFAULT => getcwd() . '/data/plugins:__KEITAIRC_DATA_DIR__/plugins', ATTR => 'RO'},
+               'public_dir' => {DEFAULT => getcwd() . '/data/public:__KEITAIRC_DATA_DIR__/public', ATTR => 'RO'},
                'url_redirect' => {DEFAULT => ''},
                'smtp_server' => {DEFAULT => ''},
                'smtp_from' => {DEFAULT => ''},
                'smtp_to' => {DEFAULT => ''},
                'rgeocode_server' => {DEFAULT => 'finds'},
-               'pid_file' => {DEFAULT => 'keitairc.pid'},
-
-               'web_root' => {DEFAULT => '/', VALIDATE => \&valid_web_root},
-               'web_schema' => {DEFAULT => 'http', VALIDATE => \&valid_web_schema},
-               'fontsize' => {DEFAULT => '+0', VALIDATE => \&valid_fontsize},
-               'mobile_fontsize' => {DEFAULT => -1, VALIDATE => \&valid_fontsize},
-               'irc_charset' => {DEFAULT => 'utf8', VALIDATE => \&valid_charset},
-               'web_charset' => {DEFAULT => 'shiftjis', VALIDATE => \&valid_charset},
-               'pid_dir' => {DEFAULT => $ENV{HOME} . '/.keitairc_log', VALIDATE => \&valid_dir},
-               'url_target' => {DEFAULT => '_self', VALIDATE => \&valid_url_target},
-               'log' => {DEFAULT => 'file', VALIDATE => \&valid_log},
+               'pid_file' => {DEFAULT => 'keitairc.pid', ATTR => 'RO'},
+
+               'web_root' => {TYPE => 'web_root', DEFAULT => '/', ATTR => 'RO'},
+               'web_schema' => {TYPE => 'web_schema', DEFAULT => 'http', ATTR => 'RO'},
+               'fontsize' => {TYPE => 'fontsize', DEFAULT => '+0'},
+               'mobile_fontsize' => {TYPE => 'fontsize', DEFAULT => -1},
+               'irc_charset' => {TYPE => 'charset', DEFAULT => 'utf8'},
+               'web_charset' => {TYPE => 'charset', DEFAULT => 'shiftjis'},
+               'pid_dir' => {TYPE => 'dir', DEFAULT => $ENV{HOME} . '/.keitairc_log', ATTR => 'RO'},
+               'url_target' => {TYPE => 'url_target', DEFAULT => '_self'},
+               'log' => {TYPE => 'log', DEFAULT => 'file', ATTR => 'RO'},
 
                # optional integer params
-               'irc_port' => {DEFAULT => 6667, VALIDATE => \&valid_int},
-               'cookie_ttl' => {DEFAULT => 86400 * 3, VALIDATE => \&valid_int},  # 3 days
-               'session_ttl' => {DEFAULT => 60 * 30, VALIDATE => \&valid_int},  # 30 min
-               'cache_expire' => {DEFAULT => 10800, VALIDATE => \&valid_int},
-               'web_port' => {DEFAULT => 8080, VALIDATE => \&valid_int},
-               'web_lines' => {DEFAULT => 100, VALIDATE => \&valid_int},
-               'ping_delay' => {DEFAULT => 30, VALIDATE => \&valid_int},
-               'reconnect_delay' => {DEFAULT => 10, VALIDATE => \&valid_int},
+               'irc_port' => {TYPE => 'int', DEFAULT => 6667},
+               'cookie_ttl' => {TYPE => 'int', DEFAULT => 86400 * 3},  # 3 days
+               'session_ttl' => {TYPE => 'int', DEFAULT => 60 * 30},  # 30 min
+               'cache_expire' => {TYPE => 'int', DEFAULT => 3600 * 12}, # 12 hour
+               'web_port' => {TYPE => 'int', DEFAULT => 8080},
+               'web_lines' => {TYPE => 'int', DEFAULT => 100},
+               'ping_delay' => {TYPE => 'int', DEFAULT => 30},
+               'reconnect_delay' => {TYPE => 'int', DEFAULT => 10},
 
                # optional boolean params
-               'show_joinleave' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
-               'show_console' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0},
-               'follow_nick' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
-               'debug' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0},
-               'daemonize' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0},
-               'reverse_message' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
-               'reverse_recent' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
-               'reverse_unread' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
-               'webkit_newui' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1},
+               'show_joinleave' => {TYPE => 'bool', DEFAULT => 1},
+               'show_console' => {TYPE => 'bool', DEFAULT => 0},
+               'follow_nick' => {TYPE => 'bool', DEFAULT => 1},
+               'debug' => {TYPE => 'bool', DEFAULT => 0},
+               'daemonize' => {TYPE => 'bool', DEFAULT => 0},
+               'reverse_message' => {TYPE => 'bool', DEFAULT => 1},
+               'reverse_recent' => {TYPE => 'bool', DEFAULT => 1},
+               'reverse_unread' => {TYPE => 'bool', DEFAULT => 1},
+               'webkit_newui' => {TYPE => 'bool', DEFAULT => 1},
 
                # obsolates (ignored)
-               'show_newmsgonly' => {VALIDATE => \&valid_obsolates},
-               'web_username' => {VALIDATE => \&valid_obsolates},
-               'use_cookie' => {VALIDATE => \&valid_obsolates},
-               'au_pcsv' => {VALIDATE => \&valid_obsolates},
+               'show_newmsgonly' => {TYPE => 'obsolates'},
+               'web_username' => {TYPE => 'obsolates'},
+               'use_cookie' => {TYPE => 'obsolates'},
+               'au_pcsv' => {TYPE => 'obsolates'},
                );
 
        if(-r '/etc/keitairc'){
@@ -118,7 +119,7 @@ sub new{
        $me->args(\@argv);
 
        # check required parameters
-       foreach my $n (qw(irc_nick irc_username irc_server web_host web_password)) {
+       foreach my $n (keys %{$me->{'REQ'}}) {
                if(!defined($me->get($n)) || !length($me->get($n))) {
                        die($n . ' does not specified');
                }
@@ -132,7 +133,7 @@ sub new{
 }
 
 ################################################################
-sub file{
+sub file {
        my $me = shift;
        my $file = shift;
        if(-r $file){
@@ -144,6 +145,73 @@ sub file{
 }
 
 ################################################################
+sub define {
+       my $me = shift;
+       my @args = ();
+
+       while (@_) {
+               my $var = shift;
+               my $cfg = ref($_[0]) eq 'HASH' ? shift : { };
+               if (defined $cfg->{TYPE}) {
+                       if (!defined $cfg->{VALIDATE} && defined &{'valid_' . $cfg->{TYPE}}) {
+                               $cfg->{VALIDATE} = \&{'valid_' . $cfg->{TYPE}};
+                       }
+                       if (!defined $cfg->{ARGCOUNT} && $cfg->{TYPE} eq 'bool') {
+                               $cfg->{ARGCOUNT} = ARGCOUNT_NONE;
+                       }
+                       $me->type($var, $cfg->{TYPE});
+                       delete $cfg->{TYPE};
+               }
+               if (defined $cfg->{ATTR}) {
+                       my @attr = split(/\|/, $cfg->{ATTR});
+                       foreach my $at (@attr) {
+                               if ($at eq 'RO') {
+                                       $me->readonly($var, 1);
+                               } elsif ($at eq 'REQ') {
+                                       $me->required($var, 1);
+                               } else {
+                                       warn 'Ignore unknown attribute: ' . $at;
+                               }
+                       }
+                       delete $cfg->{ATTR};
+               }
+               push(@args, $var => $cfg);
+       }
+
+       return $me->SUPER::define(@args);
+}
+
+sub type {
+       my ($me, $name, $type) = @_;
+       $me->{TYPE} = {} if (!defined $me->{TYPE});
+       $me->{TYPE}->{$name} = $type if (defined $type);
+       return (defined $me->{TYPE}->{$name} ? $me->{TYPE}->{$name} : 'string');
+}
+
+sub bool_attr {
+       my ($me, $type_name, $name, $flag) = @_;
+       $me->{$type_name} = {} if (!defined $me->{$type_name});
+       if (defined $flag) {
+               if ($flag) {
+                       $me->{$type_name}->{$name} = 1;
+               } else {
+                       delete $me->{$type_name}->{$name};
+               }
+       }
+       return defined $me->{$type_name}->{$name};
+}
+
+sub readonly {
+       my $me = shift;
+       return $me->bool_attr('RO', @_);
+}
+
+sub required {
+       my $me = shift;
+       return $me->bool_attr('REQ', @_);
+}
+
+################################################################
 sub content_charset{
        my $me = shift;
        Encode::MIME::Name::get_mime_name(Encode::resolve_alias($me->web_charset()));