Add a JSON reader loader
diff --git a/jsonLoader.go b/jsonLoader.go
index 1edc702..080e493 100644
--- a/jsonLoader.go
+++ b/jsonLoader.go
@@ -293,6 +293,31 @@
 
 }
 
+type jsonIOLoader struct {
+	buf *bytes.Buffer
+}
+
+func NewReaderLoader(source io.Reader) (*jsonIOLoader, io.Reader) {
+	buf := &bytes.Buffer{}
+	return &jsonIOLoader{buf: buf}, io.TeeReader(source, buf)
+}
+
+func (l *jsonIOLoader) JsonSource() interface{} {
+	return l.buf.String()
+}
+
+func (l *jsonIOLoader) LoadJSON() (interface{}, error) {
+	return decodeJsonUsingNumber(l.buf)
+}
+
+func (l *jsonIOLoader) JsonReference() (gojsonreference.JsonReference, error) {
+	return gojsonreference.NewJsonReference("#")
+}
+
+func (l *jsonIOLoader) LoaderFactory() JSONLoaderFactory {
+	return &DefaultJSONLoaderFactory{}
+}
+
 func decodeJsonUsingNumber(r io.Reader) (interface{}, error) {
 
 	var document interface{}
diff --git a/schema_test.go b/schema_test.go
index a7b9d34..7503d2f 100644
--- a/schema_test.go
+++ b/schema_test.go
@@ -26,7 +26,9 @@
 package gojsonschema
 
 import (
+	"bytes"
 	"fmt"
+	"io/ioutil"
 	"net/http"
 	"os"
 	"reflect"
@@ -491,8 +493,18 @@
 }`
 
 func TestLoaders(t *testing.T) {
+	// setup reader loader
+	reader := bytes.NewBufferString(simpleSchema)
+	readerLoader, wrappedReader := NewReaderLoader(reader)
+
+	// drain reader
+	by, err := ioutil.ReadAll(wrappedReader)
+	assert.Nil(t, err)
+	assert.Equal(t, simpleSchema, string(by))
+
 	loaders := []JSONLoader{
 		NewStringLoader(simpleSchema),
+		readerLoader,
 	}
 
 	for _, l := range loaders {
@@ -513,8 +525,18 @@
 }`
 
 func TestLoadersWithInvalidPattern(t *testing.T) {
+	// setup reader loader
+	reader := bytes.NewBufferString(invalidPattern)
+	readerLoader, wrappedReader := NewReaderLoader(reader)
+
+	// drain reader
+	by, err := ioutil.ReadAll(wrappedReader)
+	assert.Nil(t, err)
+	assert.Equal(t, invalidPattern, string(by))
+
 	loaders := []JSONLoader{
 		NewStringLoader(invalidPattern),
+		readerLoader,
 	}
 
 	for _, l := range loaders {