+
+ my $pos;
+ if (defined $first_ancestor) {
+ Carp::confess("Unsorted rule list")
+ if defined $last_descendant and $first_ancestor <= $last_descendant;
+ $pos = $first_ancestor;
+ } elsif (defined $last_descendant) {
+ $pos = $last_descendant + 1;
+ }
+
+ if (defined $pos) {
+ splice @$list, $pos, 1, $rule;
+ return 0;
+ }