-opendir DIR, "$bindir" or die "$!";
-my @progfiles = map { [ $_, $bindir ] } grep { /\.pl$/ && !/(_custom|^\.)/ } readdir DIR;
-seekdir DIR, 0;
-my @customfiles = grep /_custom/, readdir DIR;
-closedir DIR;
+sub find_files {
+ my ($top_dir_name) = @_;
+
+ my (@files, $finder);
+
+ $finder = sub {
+ my ($dir_name) = @_;
+
+ tie my %dir_h, 'IO::Dir', $dir_name;
+
+ push @files, grep { -f } map { "${dir_name}/${_}" } keys %dir_h;
+ my @sub_dirs = grep { -d } map { "${dir_name}/${_}" } grep { ! m/^\.\.?$/ } keys %dir_h;
+
+ $finder->($_) for @sub_dirs;
+ };
+
+ $finder->($top_dir_name);
+
+ return @files;
+}
+
+sub merge_texts {
+# overwrite existing entries with the ones from 'missing'
+ $self->{texts}->{$_} = $missing->{$_} for grep { $missing->{$_} } keys %alllocales;