+__PACKAGE__->meta->make_immutable();
+
+
+our $config = __PACKAGE__->new();
+
+sub TIEHASH {
+ return $config;
+}
+
+sub FETCH {
+ my ($this,$key) = @_;
+ my $m = $config->meta->find_method_by_name($key);
+ croak "No such element $key" if not defined $m;
+ return $m->($this);
+}
+
+sub STORE {
+ my ($this,$key,$value) = @_;
+ my $m = $config->meta->find_method_by_name($key);
+ croak "No such element $key" if not defined $m;
+ return $m->($this,$value);
+}
+
+sub EXISTS {
+ my ($this,$key) = @_;
+ my $m = $config->meta->find_method_by_name($key);
+ return defined $m;
+}
+
+sub DELETE {
+ # do nothing
+}
+
+sub CLEAR {
+ # do nothing
+}
+
+sub SCALAR {
+ return "Debbugs::Config(HASH)"
+}
+
+sub UNTIE {
+ # do nothing
+}
+
+sub DESTROY {
+ # do nothing
+}
+
+our %config;
+tie %config,__PACKAGE__;
+
+
+# untaint $ENV{DEBBUGS_CONFIG_FILE} if it's owned by us
+# This enables us to test things that are -T.
+if (exists $ENV{DEBBUGS_CONFIG_FILE}) {
+# This causes all sorts of problems for mirrors of debbugs; disable
+# it.
+# if (${[stat($ENV{DEBBUGS_CONFIG_FILE})]}[4] == $<) {
+ $ENV{DEBBUGS_CONFIG_FILE} =~ /(.+)/;
+ $ENV{DEBBUGS_CONFIG_FILE} = $1;
+# }
+# else {
+# die "Environmental variable DEBBUGS_CONFIG_FILE set, and $ENV{DEBBUGS_CONFIG_FILE} is not owned by the user running this script.";
+# }
+}
+read_config($config,exists $ENV{DEBBUGS_CONFIG_FILE}?$ENV{DEBBUGS_CONFIG_FILE}:'/etc/debbugs/config');
+