The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

my $meta_file;
BEGIN {
  eval { require CPAN::Meta }
    or plan skip_all => 'CPAN::Meta required for checking breakages';
  eval { require CPAN::Meta::Requirements }
    or plan skip_all => 'CPAN::Meta::Requirements required for checking breakages';
  ($meta_file) = grep -f, qw(MYMETA.json MYMETA.yml META.json META.yml)
    or plan skip_all => 'no META file exists';
}

use ExtUtils::MakeMaker;
use Module::Runtime qw(module_notional_filename);

my $meta = CPAN::Meta->load_file($meta_file)->as_struct;
my $req = CPAN::Meta::Requirements->from_string_hash( $meta->{x_breaks} );

pass 'checking breakages...';

my @breaks;
for my $module ($req->required_modules) {
  my ($pm_file) = grep -e, map $_.'/'.module_notional_filename($module), @INC;
  next
    unless $pm_file;
  my $version = MM->parse_version($pm_file);
  next
    unless defined $version;
  (my $check_version = $version) =~ s/_//;
  if ($req->accepts_module($module, $version)) {
    my $broken_v = $req->requirements_for_module($module);
    $broken_v = ">= $broken_v"
      unless $broken_v =~ /\A\s*(?:==|>=|>|<=|<|!=)/;
    push @breaks, [$module, $check_version, $broken_v];
  }
}

if (@breaks) {
  diag "Installing Moo $meta->{version} will break these modules:\n\n"
  . (join '', map {
    "$_->[0] (found version $_->[1])\n"
    . "  Broken versions: $_->[2]\n"
  } @breaks)
  . "\nYou should now update these modules!";
}

done_testing;