The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More tests => 6 * 2;

my @comp = (0, 0);
my @exec = (0, 0);

my $rx;

{
 use re::engine::Plugin comp => sub { ++$comp[0] },
                        exec => sub { ++$exec[0]; 0 };

 eval '$rx = qr/foo/';
 is "@comp", '1 0', 'is compiled with the first engine';
 is "@exec", '0 0', 'not executed yet';
}

"abc" =~ /$rx/;
is "@comp", '1 0', 'was compiled with the first engine';
is "@exec", '1 0', 'is executed with the first engine';

{
 use re::engine::Plugin comp => sub { ++$comp[1] },
                        exec => sub { ++$exec[1]; 0 };

 "def" =~ /$rx/;
 is "@comp", '1 0', 'was still compiled with the first engine';
 is "@exec", '2 0', 'is executed with the first engine again';

 eval '$rx = qr/bar/';
 is "@comp", '1 1', 'is compiled with the second engine';
 is "@exec", '2 0', 'not executed since last time';
}

"ghi" =~ /$rx/;
is "@comp", '1 1', 'was compiled with the second engine';
is "@exec", '2 1', 'is executed with the second engine';

{
 use re 'debug';

 "jkl" =~ /$rx/;
 is "@comp", '1 1', 'was still compiled with the second engine';
 is "@exec", '2 2', 'is executed with the second engine again (and not with "re \'debug\'")';
}