LocalOverride
view release on metacpan or search on metacpan
lib/LocalOverride.pm view on Meta::CPAN
package LocalOverride;
use strict;
use warnings;
use PerlIO::scalar;
our $VERSION = 1.000000;
our $base_namespace = '';
our $core_only = 0;
our $local_prefix = 'Local';
BEGIN { unshift @INC, \&require_local }
my %already_seen;
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
require $filename;
my $local_file = $filename;
if ($base_namespace) {
$local_file =~ s[^$base_namespace][${base_namespace}/$local_prefix];
} else {
# Empty base namespace is probably a bad idea, but it should be
# handled anyhow
$local_file = $local_prefix . '/' . $local_file;
}
$already_seen{$local_file}++;
# Failure to load local version is not fatal, since it may not exist
eval { require $local_file };
open my $fh, '<', \'1';
return $fh;
}
sub import {
my (undef, %opts) = @_;
if ($opts{base_namespace}) {
$base_namespace = $opts{base_namespace};
delete $opts{base_namespace};
}
if ($opts{core_only}) {
$core_only = $opts{core_only};
delete $opts{core_only};
}
if ($opts{local_prefix}) {
$local_prefix = $opts{local_prefix};
delete $opts{local_prefix};
}
warn "LocalOverride loaded with unrecognized option $_\n" for keys %opts;
}
sub unimport {
@INC = grep { !(ref $_ && $_ == \&require_local) } @INC;
}
1;
=pod
=head1 NAME
LocalOverride - Transparently override subs with those in local module versions
=head1 VERSION
version 1.000
=head1 SYNOPSIS
use LocalOverride;
( run in 1.990 second using v1.01-cache-2.11-cpan-39bf76dae61 )