Add Succeed Matcher
diff --git a/CHANGELOG.md b/CHANGELOG.md
index faad006..ea269ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
 - `Receive()` no longer errors when passed a closed channel, it's perfectly fine to attempt to read from a closed channel so Ω(c).Should(Receive()) always fails and Ω(c).ShoudlNot(Receive()) always passes with a closed channel.
 - Added `HavePrefix` and `HaveSuffix` matchers.
 - `ghttp` can now handle concurrent requests.
+- Added `Succeed` which allows one to write `Ω(MyFunction()).Should(Succeed())`.
 
 ## 1.0 (8/2/2014)
 
diff --git a/matchers.go b/matchers.go
index 708e697..307f88a 100644
--- a/matchers.go
+++ b/matchers.go
@@ -49,6 +49,21 @@
 	return &matchers.HaveOccurredMatcher{}
 }
 
+//Succeed passes if actual is a nil error
+//Succeed is intended to be used with functions that return a single error value. Instead of
+//    err := SomethingThatMightFail()
+//    Ω(err).ShouldNot(HaveOccurred())
+//
+//You can write:
+//    Ω(SomethingThatMightFail()).Should(Succeed())
+//
+//It is a mistake to use Succeed with a function that has multiple return values.  Gomega's Ω and Expect
+//functions automatically trigger failure if any return values after the first return value are non-zero/non-nil.
+//This means that Ω(MultiReturnFunc()).ShouldNot(Succeed()) can never pass.
+func Succeed() types.GomegaMatcher {
+	return &matchers.SucceedMatcher{}
+}
+
 //MatchError succeeds if actual is a non-nil error that matches the passed in string/error.
 //
 //These are valid use-cases:
diff --git a/matchers/succeed_matcher.go b/matchers/succeed_matcher.go
new file mode 100644
index 0000000..c162b67
--- /dev/null
+++ b/matchers/succeed_matcher.go
@@ -0,0 +1,30 @@
+package matchers
+
+import (
+	"fmt"
+
+	"github.com/onsi/gomega/format"
+)
+
+type SucceedMatcher struct {
+}
+
+func (matcher *SucceedMatcher) Match(actual interface{}) (success bool, err error) {
+	if actual == nil {
+		return true, nil
+	}
+
+	if isError(actual) {
+		return false, nil
+	}
+
+	return false, fmt.Errorf("Expected an error-type.  Got:\n%s", format.Object(actual, 1))
+}
+
+func (matcher *SucceedMatcher) FailureMessage(actual interface{}) (message string) {
+	return fmt.Sprintf("Expected success, but got an error:\n%s", format.Object(actual, 1))
+}
+
+func (matcher *SucceedMatcher) NegatedFailureMessage(actual interface{}) (message string) {
+	return "Expected failure, but got no error."
+}
diff --git a/matchers/succeed_matcher_test.go b/matchers/succeed_matcher_test.go
new file mode 100644
index 0000000..3562e70
--- /dev/null
+++ b/matchers/succeed_matcher_test.go
@@ -0,0 +1,39 @@
+package matchers_test
+
+import (
+	"errors"
+
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	. "github.com/onsi/gomega/matchers"
+)
+
+func Erroring() error {
+	return errors.New("bam")
+}
+
+func NotErroring() error {
+	return nil
+}
+
+type AnyType struct{}
+
+func Invalid() *AnyType {
+	return nil
+}
+
+var _ = Describe("Succeed", func() {
+	It("should succeed if the function succeeds", func() {
+		Ω(NotErroring()).Should(Succeed())
+	})
+
+	It("should succeed (in the negated) if the function errored", func() {
+		Ω(Erroring()).ShouldNot(Succeed())
+	})
+
+	It("should not if passed a non-error", func() {
+		success, err := (&SucceedMatcher{}).Match(Invalid())
+		Ω(success).Should(BeFalse())
+		Ω(err).Should(HaveOccurred())
+	})
+})