diff -rupN lib_orig/Log/Log4perl/Config/Combo.pm lib/Log/Log4perl/Config/Combo.pm
--- lib_orig/Log/Log4perl/Config/Combo.pm	1970-01-01 01:00:00.000000000 +0100
+++ lib/Log/Log4perl/Config/Combo.pm	2008-10-01 18:50:45.000000000 +0200
@@ -0,0 +1,77 @@
+package Log::Log4perl::Config::Combo;
+use strict; use warnings;
+
+sub ego { shift }
+
+# accessors
+sub _files  :lvalue { ego(shift)->{files} }  # file names
+sub _stats  :lvalue { ego(shift)->{stats} }  # saved stats (for id check)
+sub _our_id :lvalue { ego(shift)->{our_id} } # fake id for fake stat
+
+sub _old_stat :lvalue {
+    my ($combo, $file) = @_;
+    $combo->_stats->{$file};
+}
+sub files { @{ shift()->_files } }
+sub our_id { @{ shift()->_our_id } }
+sub change_id { ++ shift->_our_id->[1] }
+
+# creation, initialisation
+sub new {
+    my $class = shift;
+    bless({}, $class)->init(@_);
+}
+
+sub init {
+    my ($combo, @files) = @_;
+    $combo->_files = \ @files;
+    $combo->_stats = {map +($_, [stat]), @files};
+    $combo->_our_id = [0, 0];
+    $combo;
+}
+
+# operative methods read and stat
+
+# all lines of concatenated files go into linesref
+sub read {
+    my ($combo, $linesref) = @_;
+    @$linesref = ();
+    for my $file ( $combo->files ) {
+        open my $fh, '<', $file or next;
+        push @$linesref, <$fh>;
+    }
+    $combo; # can be chained
+}
+
+# fake positions 0, 1, and 9 (dev, ino, mtime) of a stat vector
+# dev/ino are arbitrary but change if one of the files changes identity
+# mtime will be the latest change time of all files
+sub stat {
+    my ($combo) = @_;
+    my $young = 0;
+    for my $file ( $combo->files ) {
+        my $stat = [stat($file)];
+        $combo->change_id if _id_changed($combo->_old_stat($file), $stat);
+        $combo->_old_stat($file) = $stat; # update
+        $young >= $_ or $young = $_ for $stat->[9] || 0; # maintain max
+    }
+    my @fake;
+    @fake[0, 1, 9] = ($combo->our_id, $young);
+    @fake;
+}
+
+# check stat vectors for change of file
+# a change is a change in dev and/or ino. it also counts as a change
+# if the file exists now but didn't then, or vice versa.
+sub _id_changed {
+    my ($old, $new) = @_;
+    no warnings 'uninitialized';
+    grep +(
+        defined($old->[$_]) != defined($new->[$_]) or
+        $old->[$_] != $new->[$_],
+    ), 0, 1;
+}
+
+1;
+
+__END__
diff -rupN lib_orig/Log/Log4perl/Config/Watch.pm lib/Log/Log4perl/Config/Watch.pm
--- lib_orig/Log/Log4perl/Config/Watch.pm	2008-08-20 00:52:38.000000000 +0200
+++ lib/Log/Log4perl/Config/Watch.pm	2008-10-01 17:31:54.000000000 +0200
@@ -72,7 +72,7 @@ sub file_has_moved {
     my($self, $time, $force) = @_;
 
     my $task = sub {
-        my @stat = stat($self->{file});
+        my @stat = $self->get_stat;
 
         my $has_moved = 0;
 
@@ -105,7 +105,7 @@ sub change_detected {
     my($self, $time, $force) = @_;
 
     my $task = sub {
-        my @stat = stat($self->{file});
+        my @stat = $self->get_stat;
         my $new_timestamp = $stat[9];
 
         if(! defined $new_timestamp) {
@@ -160,6 +160,17 @@ sub check {
     return $task->($time);
 }
 
+###########################################
+sub get_stat {
+###########################################
+    my($self) = @_;
+    my $file = $self->file;
+    if (ref $file) { # must be a Log::Log4perl::Config::Combo object
+        return $file->stat;
+    } else {
+        return stat $file;
+    }
+}
 1;
 
 __END__
diff -rupN lib_orig/Log/Log4perl/Config.pm lib/Log/Log4perl/Config.pm
--- lib_orig/Log/Log4perl/Config.pm	2008-08-19 23:25:47.000000000 +0200
+++ lib/Log/Log4perl/Config.pm	2008-10-01 17:31:54.000000000 +0200
@@ -64,7 +64,9 @@ sub init_and_watch {
 
     defined ($delay) or $delay = $DEFAULT_WATCH_DELAY;  
 
-    if (ref $config) {
+    $config = make_combo(@$config) if ref $config eq 'ARRAY';
+
+    if (ref $config and not $config->isa(__PACKAGE__ . '::Combo')) {
         die "Log4perl can only watch a file, not a string of " .
             "configuration information";
     }elsif ($config =~ m!^(https?|ftp|wais|gopher|file):!){
@@ -562,12 +564,21 @@ sub config_read {
         print "Reading config from scalar\n" if _INTERNAL_DEBUG;
         @text = split(/\n/,$$config);
 
+    } elsif (ref $config eq 'ARRAY') { # list of file names, convert
+                                       # to multifile object
+        print "Reading config from array\n" if _INTERNAL_DEBUG;
+        $config = make_combo(@$config);
+
     } elsif (ref $config eq 'GLOB' or 
              ref $config eq 'IO::File') {
             # If we have a file handle, just call the reader
         print "Reading config from file handle\n" if _INTERNAL_DEBUG;
         config_file_read($config, \@text);
 
+    } elsif (ref $config and $config->isa(__PACKAGE__ . '::Combo')) {
+        print "Reading config from multifile object\n" if _INTERNAL_DEBUG;
+        $config->read(\@text);
+
     } elsif (ref $config) {
             # Caller provided a config parser object, which already
             # knows which file (or DB or whatever) to parse.
@@ -648,6 +659,12 @@ sub config_read {
     return $data;
 }
 
+###########################################
+sub make_combo {
+###########################################
+    require Log::Log4perl::Config::Combo;
+    Log::Log4perl::Config::Combo->new(@_);
+}
 
 ###########################################
 sub config_file_read {
