Adding AllKeys and AllSettings functions and tests
diff --git a/viper.go b/viper.go
index c788770..c45abc8 100644
--- a/viper.go
+++ b/viper.go
@@ -393,6 +393,38 @@
 	}
 }
 
+func AllKeys() []string {
+	m := map[string]struct{}{}
+
+	for key, _ := range defaults {
+		m[key] = struct{}{}
+	}
+
+	for key, _ := range config {
+		m[key] = struct{}{}
+	}
+
+	for key, _ := range override {
+		m[key] = struct{}{}
+	}
+
+	a := []string{}
+	for x, _ := range m {
+		a = append(a, x)
+	}
+
+	return a
+}
+
+func AllSettings() map[string]interface{} {
+	m := map[string]interface{}{}
+	for _, x := range AllKeys() {
+		m[x] = Get(x)
+	}
+
+	return m
+}
+
 // Name for the config file.
 // Does not include extension.
 func SetConfigName(in string) {
diff --git a/viper_test.go b/viper_test.go
index 311c3ef..fba5a18 100644
--- a/viper_test.go
+++ b/viper_test.go
@@ -8,7 +8,9 @@
 import (
 	"bytes"
 	"os"
+	"sort"
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/assert"
 )
@@ -138,6 +140,20 @@
 	assert.Equal(t, "apple", Get("f"))
 }
 
+func TestAllKeys(t *testing.T) {
+	ks := sort.StringSlice{"title", "owner", "name", "beard", "ppu", "batters", "hobbies", "clothing", "age", "hacker", "id", "type"}
+	dob, _ := time.Parse(time.RFC3339, "1979-05-27T07:32:00Z")
+	all := map[string]interface{}{"hacker": true, "beard": true, "batters": map[string]interface{}{"batter": []interface{}{map[string]interface{}{"type": "Regular"}, map[string]interface{}{"type": "Chocolate"}, map[string]interface{}{"type": "Blueberry"}, map[string]interface{}{"type": "Devil's Food"}}}, "hobbies": []interface{}{"skateboarding", "snowboarding", "go"}, "ppu": 0.55, "clothing": map[interface{}]interface{}{"jacket": "leather", "trousers": "denim"}, "name": "crunk", "owner": map[string]interface{}{"organization": "MongoDB", "Bio": "MongoDB Chief Developer Advocate & Hacker at Large", "dob": dob}, "id": "13", "title": "TOML Example", "age": 35, "type": "donut"}
+
+	var allkeys sort.StringSlice
+	allkeys = AllKeys()
+	allkeys.Sort()
+	ks.Sort()
+
+	assert.Equal(t, ks, allkeys)
+	assert.Equal(t, all, AllSettings())
+}
+
 func TestCaseInSensitive(t *testing.T) {
 	assert.Equal(t, true, Get("hacker"))
 	Set("Title", "Checking Case")