Merge pull request #79 from jsouthworth/fix/78

Fix a few bugs related to storing values.
diff --git a/dbus.go b/dbus.go
index 51f531b..446c5d0 100644
--- a/dbus.go
+++ b/dbus.go
@@ -81,6 +81,11 @@
 }
 
 func setDest(dest, src reflect.Value) error {
+	if !isVariant(src.Type()) && isVariant(dest.Type()) {
+		//special conversion for dbus.Variant
+		dest.Set(reflect.ValueOf(MakeVariant(src.Interface())))
+		return nil
+	}
 	if !src.Type().ConvertibleTo(dest.Type()) {
 		return errors.New(
 			"dbus.Store: type mismatch")
@@ -171,17 +176,26 @@
 func newDestValue(srcValue reflect.Value, destType reflect.Type) reflect.Value {
 	switch srcValue.Kind() {
 	case reflect.Map:
-		if !isVariant(srcValue.Type().Elem()) {
+		switch {
+		case !isVariant(srcValue.Type().Elem()):
 			return reflect.New(destType)
+		case destType.Kind() == reflect.Map:
+			return reflect.New(destType)
+		default:
+			return reflect.New(
+				reflect.MapOf(srcValue.Type().Key(), destType))
 		}
-		return reflect.New(
-			reflect.MapOf(srcValue.Type().Key(), destType))
+
 	case reflect.Slice:
-		if !isVariant(srcValue.Type().Elem()) {
+		switch {
+		case !isVariant(srcValue.Type().Elem()):
 			return reflect.New(destType)
+		case destType.Kind() == reflect.Slice:
+			return reflect.New(destType)
+		default:
+			return reflect.New(
+				reflect.SliceOf(destType))
 		}
-		return reflect.New(
-			reflect.SliceOf(destType))
 	default:
 		if !isVariant(srcValue.Type()) {
 			return reflect.New(destType)
diff --git a/encoder_test.go b/encoder_test.go
index 8e3b19d..91a0312 100644
--- a/encoder_test.go
+++ b/encoder_test.go
@@ -332,3 +332,33 @@
 			out, val)
 	}
 }
+
+func TestEncodeVariant(t *testing.T) {
+	var res map[ObjectPath]map[string]map[string]Variant
+	var src = map[ObjectPath]map[string]map[string]Variant{
+		ObjectPath("/foo/bar"): {
+			"foo": {
+				"bar": MakeVariant(10),
+				"baz": MakeVariant("20"),
+			},
+		},
+	}
+	buf := new(bytes.Buffer)
+	order := binary.LittleEndian
+	enc := newEncoder(buf, binary.LittleEndian)
+	err := enc.Encode(src)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	dec := newDecoder(buf, order)
+	v, err := dec.Decode(SignatureOf(src))
+	if err != nil {
+		t.Fatal(err)
+	}
+	err = Store(v, &res)
+	if err != nil {
+		t.Fatal(err)
+	}
+	_ = res[ObjectPath("/foo/bar")]["foo"]["baz"].Value().(string)
+}