#!/usr/bin/perl
    BEGIN {
      my $file_name = __FILE__;
      $file_name =~ s{[^/\\]+$}{};
      $file_name = '.' unless length $file_name;
      require ($file_name . "/cpanm");
    }

    require JSON::PP;
    my $orig_jsonpp = \&JSON::PP::new;
    *JSON::PP::new = sub {
      return $orig_jsonpp->(@_)->allow_blessed;
    };

    sub CPAN::Meta::TO_JSON { undef }

    my $orig_unsatisfied_deps = \&App::cpanminus::script::unsatisfied_deps;
    *App::cpanminus::script::unsatisfied_deps = sub {
      if ($_[0]->{scandeps}) {
        return ();
      } else {
        return $orig_unsatisfied_deps->(@_);
      }
    };

    ## To support "Checking if you have ExtUtils::MakeMaker 7.0401 ... Yes (7.04_01)":-<
    my $orig_accepts = \&CPAN::Meta::Requirements::_Range::Range::_accepts;
    *CPAN::Meta::Requirements::_Range::Range::_accepts = sub {
      my ($self, $version) = @_;
      return 1 if $orig_accepts->(@_);
      if (defined $self->{minimum} and
          not defined $self->{maximum} and not defined $self->{exclusions}) {
        my $min = $self->{minimum};
        $min =~ tr/_//d;
        $version =~ tr/_//d;
        return 1 if $min eq $version;
      }
      return;
    }; # _accepts

    my $orig_search_module = \&App::cpanminus::script::search_module;
    *App::cpanminus::script::search_module = sub {
      my ($self, $module, $version) = @_;
      if ($module eq 'ExtUtils::MakeMaker' and
          defined $version and
          $version =~ /^(\d+)\.(\d{2})(\d{2})$/) {
        $version = "$1.$2\_$3";
        warn "$module $1.$2$3 -> $version rewritten\n";
      }
      return $orig_search_module->($self, $module, $version);
    }; # search_module

    my $orig_search_mirror_index_file = \&App::cpanminus::script::search_mirror_index_file;
    *App::cpanminus::script::search_mirror_index_file = sub {
      my $self = shift;
      my ($file, $module, $version) = @_;
      my $value = $orig_search_mirror_index_file->($self, @_);
      return $value if $value;

      open my $fh, '<', $file or return undef;
      my $found;
      while (<$fh>) {
        if (m!^\Q$module\E\s+([\w\.]+)\s+(.*)!m) {
          $found = $self->cpan_module($module, $2, $1);
          last;
        }
      }

      if ($found) {
        if (!$version or
          version->new($found->{module_version} || 0) >= version->new($version)) {
          return $found;
        } else {
          $self->chat("Found $module version $found->{module_version} < $version.\n");
        }
      }
      return undef;
    }; # search_mirror_index_file

    setpgrp 0, 0 unless $^O eq 'MSWin32';
    
    my $app = App::cpanminus::script->new;
    $app->parse_options (@ARGV);
    exit $app->doit;
  