protected abstract static class Reactor<L> {
public L hitTest (Events.Position event) {
// take a snapshot of the regions list to avoid concurrent modification if reactions
// are added or removed during processing
List<Reaction<L>> snapshot = new ArrayList<Reaction<L>>(_reactions);
Point p = new Point(event.x(), event.y());
for (int ii = snapshot.size() - 1; ii >= 0; ii--) {
Reaction<L> r = snapshot.get(ii);
if (r.region.hasExpired()) {
_reactions.remove(r);
} else if (r.region.canTrigger() && r.region.hitTest(p)) {