pull oracle matcher into its own package
diff --git a/internal/asyncassertion/async_assertion.go b/internal/asyncassertion/async_assertion.go
index b007383..bce0853 100644
--- a/internal/asyncassertion/async_assertion.go
+++ b/internal/asyncassertion/async_assertion.go
@@ -6,6 +6,7 @@
 	"reflect"
 	"time"
 
+	"github.com/onsi/gomega/internal/oraclematcher"
 	"github.com/onsi/gomega/types"
 )
 
@@ -86,27 +87,12 @@
 	return assertion.actualInput, nil
 }
 
-type oracleMatcher interface {
-	MatchMayChangeInTheFuture(actual interface{}) bool
-}
-
 func (assertion *AsyncAssertion) matcherMayChange(matcher types.GomegaMatcher, value interface{}) bool {
 	if assertion.actualInputIsAFunction() {
 		return true
 	}
 
-	return MatchMayChangeInTheFuture(matcher, value)
-}
-
-//MatchMayChangeInTheFuture is a helper to call MatchMayChangeInTheFuture on an unknown matcher.
-//If matcher implements oracleMatcher, it will call the method. Otherwise just returns true.
-func MatchMayChangeInTheFuture(matcher types.GomegaMatcher, value interface{}) bool {
-	oracleMatcher, ok := matcher.(oracleMatcher)
-	if !ok {
-		return true
-	}
-
-	return oracleMatcher.MatchMayChangeInTheFuture(value)
+	return oraclematcher.MatchMayChangeInTheFuture(matcher, value)
 }
 
 func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch bool, optionalDescription ...interface{}) bool {
diff --git a/internal/oraclematcher/oracle_matcher.go b/internal/oraclematcher/oracle_matcher.go
new file mode 100644
index 0000000..66cad88
--- /dev/null
+++ b/internal/oraclematcher/oracle_matcher.go
@@ -0,0 +1,25 @@
+package oraclematcher
+
+import "github.com/onsi/gomega/types"
+
+/*
+GomegaMatchers that also match the OracleMatcher interface can convey information about
+whether or not their result will change upon future attempts.
+
+This allows `Eventually` and `Consistently` to short circuit if success becomes impossible.
+
+For example, a process' exit code can never change.  So, gexec's Exit matcher returns `true`
+for `MatchMayChangeInTheFuture` until the process exits, at which point it returns `false` forevermore.
+*/
+type OracleMatcher interface {
+	MatchMayChangeInTheFuture(actual interface{}) bool
+}
+
+func MatchMayChangeInTheFuture(matcher types.GomegaMatcher, value interface{}) bool {
+	oracleMatcher, ok := matcher.(OracleMatcher)
+	if !ok {
+		return true
+	}
+
+	return oracleMatcher.MatchMayChangeInTheFuture(value)
+}
diff --git a/matchers/and.go b/matchers/and.go
index 5257b76..94c42a7 100644
--- a/matchers/and.go
+++ b/matchers/and.go
@@ -2,8 +2,9 @@
 
 import (
 	"fmt"
+
 	"github.com/onsi/gomega/format"
-	"github.com/onsi/gomega/internal/asyncassertion"
+	"github.com/onsi/gomega/internal/oraclematcher"
 	"github.com/onsi/gomega/types"
 )
 
@@ -51,13 +52,13 @@
 	if m.firstFailedMatcher == nil {
 		// so all matchers succeeded.. Any one of them changing would change the result.
 		for _, matcher := range m.Matchers {
-			if asyncassertion.MatchMayChangeInTheFuture(matcher, actual) {
+			if oraclematcher.MatchMayChangeInTheFuture(matcher, actual) {
 				return true
 			}
 		}
 		return false // none of were going to change
 	} else {
 		// one of the matchers failed.. it must be able to change in order to affect the result
-		return asyncassertion.MatchMayChangeInTheFuture(m.firstFailedMatcher, actual)
+		return oraclematcher.MatchMayChangeInTheFuture(m.firstFailedMatcher, actual)
 	}
 }
diff --git a/matchers/matcher_tests_suite_test.go b/matchers/matcher_tests_suite_test.go
index 4bc6d9d..01b11b9 100644
--- a/matchers/matcher_tests_suite_test.go
+++ b/matchers/matcher_tests_suite_test.go
@@ -2,6 +2,7 @@
 
 import (
 	"testing"
+
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 )
@@ -25,5 +26,5 @@
 
 func Test(t *testing.T) {
 	RegisterFailHandler(Fail)
-	RunSpecs(t, "Gomega")
+	RunSpecs(t, "Gomega Matchers")
 }
diff --git a/matchers/not.go b/matchers/not.go
index 6aed858..2c91670 100644
--- a/matchers/not.go
+++ b/matchers/not.go
@@ -1,7 +1,7 @@
 package matchers
 
 import (
-	"github.com/onsi/gomega/internal/asyncassertion"
+	"github.com/onsi/gomega/internal/oraclematcher"
 	"github.com/onsi/gomega/types"
 )
 
@@ -26,5 +26,5 @@
 }
 
 func (m *NotMatcher) MatchMayChangeInTheFuture(actual interface{}) bool {
-	return asyncassertion.MatchMayChangeInTheFuture(m.Matcher, actual) // just return m.Matcher's value
+	return oraclematcher.MatchMayChangeInTheFuture(m.Matcher, actual) // just return m.Matcher's value
 }
diff --git a/matchers/or.go b/matchers/or.go
index 29ad5c6..3bf7998 100644
--- a/matchers/or.go
+++ b/matchers/or.go
@@ -2,8 +2,9 @@
 
 import (
 	"fmt"
+
 	"github.com/onsi/gomega/format"
-	"github.com/onsi/gomega/internal/asyncassertion"
+	"github.com/onsi/gomega/internal/oraclematcher"
 	"github.com/onsi/gomega/types"
 )
 
@@ -53,11 +54,11 @@
 
 	if m.firstSuccessfulMatcher != nil {
 		// one of the matchers succeeded.. it must be able to change in order to affect the result
-		return asyncassertion.MatchMayChangeInTheFuture(m.firstSuccessfulMatcher, actual)
+		return oraclematcher.MatchMayChangeInTheFuture(m.firstSuccessfulMatcher, actual)
 	} else {
 		// so all matchers failed.. Any one of them changing would change the result.
 		for _, matcher := range m.Matchers {
-			if asyncassertion.MatchMayChangeInTheFuture(matcher, actual) {
+			if oraclematcher.MatchMayChangeInTheFuture(matcher, actual) {
 				return true
 			}
 		}
diff --git a/matchers/with_transform.go b/matchers/with_transform.go
index 21d9fe0..8e58d8a 100644
--- a/matchers/with_transform.go
+++ b/matchers/with_transform.go
@@ -2,9 +2,10 @@
 
 import (
 	"fmt"
-	"github.com/onsi/gomega/internal/asyncassertion"
-	"github.com/onsi/gomega/types"
 	"reflect"
+
+	"github.com/onsi/gomega/internal/oraclematcher"
+	"github.com/onsi/gomega/types"
 )
 
 type WithTransformMatcher struct {
@@ -67,5 +68,5 @@
 	// Querying the next matcher is fine if the transformer always will return the same value.
 	// But if the transformer is non-deterministic and returns a different value each time, then there
 	// is no point in querying the next matcher, since it can only comment on the last transformed value.
-	return asyncassertion.MatchMayChangeInTheFuture(m.Matcher, m.transformedValue)
+	return oraclematcher.MatchMayChangeInTheFuture(m.Matcher, m.transformedValue)
 }