Code review changes
diff --git a/README.md b/README.md
index e755e7c..e3b5afa 100644
--- a/README.md
+++ b/README.md
@@ -74,6 +74,7 @@
   "os"
   log "github.com/Sirupsen/logrus"
   "github.com/Sirupsen/logrus/hooks/airbrake"
+  "github.com/Sirupsen/logrus/hooks/bugsnag"
 )
 
 func init() {
@@ -84,6 +85,11 @@
   // an exception tracker. You can create custom hooks, see the Hooks section.
   log.AddHook(&logrus_airbrake.AirbrakeHook{})
 
+  // Use the Bugsnag hook to report errors that have Error severity or above to
+  // an exception tracker. You can create custom hooks, see the Hooks section.
+  bugsnagHook, _ = logrus_bugsnag.NewBugsnagHook()
+  log.AddHook(bugsnagHook)
+
   // Output to stderr instead of stdout, could also be a file.
   log.SetOutput(os.Stderr)
 
diff --git a/hooks/bugsnag/bugsnag.go b/hooks/bugsnag/bugsnag.go
index a0cfe84..d20a0f5 100644
--- a/hooks/bugsnag/bugsnag.go
+++ b/hooks/bugsnag/bugsnag.go
@@ -1,42 +1,57 @@
 package logrus_bugsnag
 
 import (
+	"errors"
+
 	"github.com/Sirupsen/logrus"
 	"github.com/bugsnag/bugsnag-go"
 )
 
-// BugsnagHook sends exceptions to an exception-tracking service compatible
-// with the Bugsnag API. Before using this hook, you must call
-// bugsnag.Configure().
+type bugsnagHook struct{}
+
+// ErrBugsnagUnconfigured is returned if NewBugsnagHook is called before
+// bugsnag.Configure. Bugsnag must be configured before the hook.
+var ErrBugsnagUnconfigured = errors.New("bugsnag must be configured before installing this logrus hook")
+
+// ErrBugsnagSendFailed indicates that the hook failed to submit an error to
+// bugsnag. The error was successfully generated, but `bugsnag.Notify()`
+// failed.
+type ErrBugsnagSendFailed struct {
+	err error
+}
+
+func (e ErrBugsnagSendFailed) Error() string {
+	return "failed to send error to Bugsnag: " + e.err.Error()
+}
+
+// NewBugsnagHook initializes a logrus hook which sends exceptions to an
+// exception-tracking service compatible with the Bugsnag API. Before using
+// this hook, you must call bugsnag.Configure(). The returned object should be
+// registered with a log via `AddHook()`
 //
 // Entries that trigger an Error, Fatal or Panic should now include an "error"
-// field to send to Bugsnag
-type BugsnagHook struct{}
+// field to send to Bugsnag.
+func NewBugsnagHook() (*bugsnagHook, error) {
+	if bugsnag.Config.APIKey == "" {
+		return nil, ErrBugsnagUnconfigured
+	}
+	return &bugsnagHook{}, nil
+}
 
 // Fire forwards an error to Bugsnag. Given a logrus.Entry, it extracts the
-// implicitly-required "error" field and sends it off.
-func (hook *BugsnagHook) Fire(entry *logrus.Entry) error {
-	if entry.Data["error"] == nil {
-		entry.Logger.WithFields(logrus.Fields{
-			"source": "bugsnag",
-		}).Warn("Exceptions sent to Bugsnag must have an 'error' key with the error")
-		return nil
-	}
-
+// "error" field (or the Message if the error isn't present) and sends it off.
+func (hook *bugsnagHook) Fire(entry *logrus.Entry) error {
+	var notifyErr error
 	err, ok := entry.Data["error"].(error)
-	if !ok {
-		entry.Logger.WithFields(logrus.Fields{
-			"source": "bugsnag",
-		}).Warn("Exceptions sent to Bugsnag must have an `error` key of type `error`")
-		return nil
+	if ok {
+		notifyErr = err
+	} else {
+		notifyErr = errors.New(entry.Message)
 	}
 
-	bugsnagErr := bugsnag.Notify(err)
+	bugsnagErr := bugsnag.Notify(notifyErr)
 	if bugsnagErr != nil {
-		entry.Logger.WithFields(logrus.Fields{
-			"source": "bugsnag",
-			"error":  bugsnagErr,
-		}).Warn("Failed to send error to Bugsnag")
+		return ErrBugsnagSendFailed{bugsnagErr}
 	}
 
 	return nil
@@ -44,7 +59,7 @@
 
 // Levels enumerates the log levels on which the error should be forwarded to
 // bugsnag: everything at or above the "Error" level.
-func (hook *BugsnagHook) Levels() []logrus.Level {
+func (hook *bugsnagHook) Levels() []logrus.Level {
 	return []logrus.Level{
 		logrus.ErrorLevel,
 		logrus.FatalLevel,
diff --git a/hooks/bugsnag/bugsnag_test.go b/hooks/bugsnag/bugsnag_test.go
index 7db5136..e9ea298 100644
--- a/hooks/bugsnag/bugsnag_test.go
+++ b/hooks/bugsnag/bugsnag_test.go
@@ -37,7 +37,7 @@
 	}))
 	defer ts.Close()
 
-	hook := &BugsnagHook{}
+	hook := &bugsnagHook{}
 
 	bugsnag.Configure(bugsnag.Configuration{
 		Endpoint:     ts.URL,