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 )