BEGIN { unshift @INC, \&require_local } sub require_local { # Exit immediately if we're not processing overrides return if $core_only; my (undef, $filename) = @_; # Keep track of what files we've already seen to avoid infinite loops return if exists $already_seen{$filename}; $already_seen{$filename}++; # We only want to check overrides in $base_namespace return unless $filename =~ /^$base_namespace/; # OK, that all passed, so we can load up the actual files # Get the original version first, then overlay the local version say STDERR "requiring $filename"; require $filename; my $local_file = $filename; if ($base_namespace) { $local_file =~ s[^$base_namespace][${base_namespace}/Local]; } else { # Empty base namespace is probably a bad idea, but it should be # handled anyhow $local_file = 'Local/' . $local_file; } $already_seen{$local_file}++; say STDERR "requiring $local_file"; # Failure to load local version is not fatal, since it may not exist no warnings 'redefine'; eval { require $local_file }; say STDERR "Done."; return sub { $_ = "1;"; 0; }; }