Accumulate errors in various places
diff --git a/mapstructure.go b/mapstructure.go
index b61070f..0a76c2f 100644
--- a/mapstructure.go
+++ b/mapstructure.go
@@ -117,20 +117,29 @@
 	mapType := reflect.MapOf(valKeyType, valElemType)
 	valMap := reflect.MakeMap(mapType)
 
+	// Accumulate errors
+	errors := make([]string, 0)
+
 	for _, k := range dataVal.MapKeys() {
 		currentData := dataVal.MapIndex(k).Interface()
 		currentVal := reflect.Indirect(reflect.New(valElemType))
 
 		fieldName := fmt.Sprintf("%s[%s]", name, k)
 		if err := decode(fieldName, currentData, currentVal); err != nil {
-			return err
+			errors = appendErrors(errors, err)
 		}
 
 		valMap.SetMapIndex(k, currentVal)
 	}
 
+	// Set the built up map to the value
 	val.Set(valMap)
 
+	// If we had errors, return those
+	if len(errors) > 0 {
+		return &Error{errors}
+	}
+
 	return nil
 }
 
@@ -149,19 +158,27 @@
 	sliceType := reflect.SliceOf(valElemType)
 	valSlice := reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len())
 
+	// Accumulate any errors
+	errors := make([]string, 0)
+
 	for i := 0; i < dataVal.Len(); i++ {
 		currentData := dataVal.Index(i).Interface()
 		currentField := valSlice.Index(i)
 
 		fieldName := fmt.Sprintf("%s[%d]", name, i)
 		if err := decode(fieldName, currentData, currentField); err != nil {
-			return err
+			errors = appendErrors(errors, err)
 		}
 	}
 
 	// Finally, set the value to the slice we built up
 	val.Set(valSlice)
 
+	// If there were errors, we return those
+	if len(errors) > 0 {
+		return &Error{errors}
+	}
+
 	return nil
 }
 
@@ -214,12 +231,7 @@
 
 		fieldName = fmt.Sprintf("%s.%s", name, fieldName)
 		if err := decode(fieldName, rawMapVal.Interface(), field); err != nil {
-			switch e := err.(type) {
-			case *Error:
-				errors = append(errors, e.Errors...)
-			default:
-				errors = append(errors, e.Error())
-			}
+			errors = appendErrors(errors, err)
 		}
 	}
 
@@ -229,3 +241,12 @@
 
 	return nil
 }
+
+func appendErrors(errors []string, err error) []string {
+	switch e := err.(type) {
+	case *Error:
+		return append(errors, e.Errors...)
+	default:
+		return append(errors, e.Error())
+	}
+}