$NetBSD: patch-ab,v 1.1 2005/09/21 21:23:46 cube Exp $

--- html/Elements/Callback.orig	2004-07-29 02:08:11.000000000 +0200
+++ html/Elements/Callback
@@ -49,7 +49,7 @@ my (%cache, $check);
 <%init>
 # checks for inode change time for each callback directory
 my $new_check = join(
-    $;, map { $_->[1] => (stat("$_->[1]/Callbacks"))[10] } $m->interp->resolver->comp_root_array
+    $;, map { $_->[1] => (stat("$_->[1]/Callbacks"))[10] } $m->interp->comp_root_array
 ) or return;
 
 $Page = $m->callers(1)->path unless ($Page);
@@ -64,8 +64,18 @@ else {
 
 if (!$callbacks) {
     my $path = "/Callbacks/*$Page/$_CallbackName";
-    $callbacks = [ $m->interp->resolver->glob_path($path) ];
-    @$callbacks = grep !/^\.|~$/, @$callbacks; #skip backup files
+
+    my @roots = map { $_->[1] } $m->interp->comp_root_array;
+    my %seen;
+
+    for my $root (@roots) {
+            push @$callbacks,
+            # Skip backup files, files without a leading package name,
+            # and files we've already seen
+            grep {     !/^\.|~$/
+                   and not $seen{$_}++ }
+                 $m->interp->resolver->glob_path($path, $root);
+    }
 
     #skip files without a package
     my $invalid_base = "/Callbacks/$Page/$_CallbackName";
