Adding the ability to get into a struct
diff --git a/viper.go b/viper.go
index e88dec9..a56472f 100644
--- a/viper.go
+++ b/viper.go
@@ -20,6 +20,7 @@
 
 	"github.com/BurntSushi/toml"
 	"github.com/kr/pretty"
+	"github.com/mitchellh/mapstructure"
 	"github.com/spf13/cast"
 	jww "github.com/spf13/jwalterweatherman"
 	"gopkg.in/yaml.v1"
@@ -93,6 +94,28 @@
 	return cast.ToStringMapString(Get(key))
 }
 
+// takes a map and uses reflection to convert it into the given Go native structure.
+// rawVal must be a pointer to a struct.
+func GetIntoStruct(key string, rawVal interface{}) error {
+	return mapstructure.Decode(Get(key), rawVal)
+}
+
+func GetAllIntoStruct(rawVal interface{}) (err error) {
+	err = mapstructure.Decode(defaults, rawVal)
+	if err != nil {
+		return
+	}
+	err = mapstructure.Decode(config, rawVal)
+	if err != nil {
+		return
+	}
+	err = mapstructure.Decode(override, rawVal)
+	if err != nil {
+		return
+	}
+	return
+}
+
 func find(key string) interface{} {
 	var val interface{}
 	var exists bool
diff --git a/viper_test.go b/viper_test.go
index f418cbd..c8ab4f9 100644
--- a/viper_test.go
+++ b/viper_test.go
@@ -128,3 +128,29 @@
 	RegisterAlias("Baz", "Roo")
 	RegisterAlias("Roo", "baz")
 }
+
+func TestIntoStruct(t *testing.T) {
+	SetDefault("port", 1313)
+	Set("name", "Steve")
+
+	type config struct {
+		Port int
+		Name string
+	}
+
+	var C config
+
+	err := GetAllIntoStruct(&C)
+	if err != nil {
+		t.Fatalf("unable to decode into struct, %v", err)
+	}
+
+	assert.Equal(t, &C, &config{Name: "Steve", Port: 1313})
+
+	Set("port", 1234)
+	err = GetAllIntoStruct(&C)
+	if err != nil {
+		t.Fatalf("unable to decode into struct, %v", err)
+	}
+	assert.Equal(t, &C, &config{Name: "Steve", Port: 1234})
+}