--- /dev/null
+=pod
+
+Test the C<mod> or C<modifiers> method
+
+=cut
+
+use strict;
+use feature ':5.10';
+use Test::More tests => 25;
+
+my @tests = (
+ sub { cmp_ok shift, 'eq', '', => 'no flags' },
+ sub { cmp_ok shift, 'eq', '', => '/c' },
+ sub { cmp_ok shift, 'eq', '' => '/g' },
+ sub { cmp_ok shift, 'eq', 'i' => '/i' },
+ sub { cmp_ok shift, 'eq', 'm' => '/m' },
+ sub { cmp_ok shift, 'eq', '' => '/o' },
+ sub { cmp_ok shift, 'eq', 's' => '/s' },
+ sub { cmp_ok shift, 'eq', 'x' => '/x' },
+ sub { cmp_ok shift, 'eq', 'p' => '/p' },
+ sub { like $_[0], qr/$_/ => "/$_ in $_[0]" for unpack "(Z)*", "xi" },
+ sub { like $_[0], qr/$_/ => "/$_ in $_[0]" for unpack "(Z)*", "xs" },
+ sub {
+ for (unpack "(Z)*", "cgimsxp") {
+ /[cg]/ and next;
+ like $_[0], qr/$_/ => "/$_ in $_[0]"
+ }
+ },
+ sub { cmp_ok shift, 'eq', '', => '/e' },
+ sub {
+ for (unpack "(Z)*", "egimsxp") {
+ /[ge]/ and next;
+ like $_[0], qr/$_/ => "/$_ in $_[0]";
+ }
+ },
+
+ sub { cmp_ok shift, 'eq', '' => '??' },
+ # Leave this as the last
+ ,sub { die "add more tests" }
+);
+
+use re::engine::Plugin (
+ exec => sub {
+ my ($re, $str) = @_;
+
+ my $t = shift @tests;
+
+ my %mod = $re->mod;
+
+ my $mod_str = join '', keys %mod;
+
+ $t->($mod_str);
+ }
+);
+
+# Provide a pattern that can match to avoid running into regexp
+# optimizations that won't call exec on C<"" =~ //>;
+
+"" =~ /x/;
+"" =~ /x/cg; # meaningless without /g
+"" =~ /x/g;
+"" =~ /x/i;
+"" =~ /x/m;
+"" =~ /x/o;
+"" =~ /x/s;
+"" =~ /x/x;
+"" =~ /x/p;
+"" =~ /x/xi;
+"" =~ /x/xs;
+"" =~ /x/cgimosxp;
+
+my $_ = "";
+
+$_ =~ s/1/2/e;
+$_ =~ s/1/2/egimosxp;
+$_ =~ ??;