Index: service/datastore/multiarg.go |
diff --git a/service/datastore/multiarg.go b/service/datastore/multiarg.go |
index 6766f3706f737538c8c8db898fdbc39bb4e53a16..cc1a6726510f6817887f6539a42ba276c780e78b 100644 |
--- a/service/datastore/multiarg.go |
+++ b/service/datastore/multiarg.go |
@@ -98,7 +98,7 @@ func multiArgTypePLS(et reflect.Type) multiArgType { |
return slot.Addr().Interface().(PropertyLoadSaver).Save(true) |
}, |
getMetaPM: func(slot reflect.Value) PropertyMap { |
- return slot.Addr().Interface().(PropertyLoadSaver).GetAllMeta() |
+ return getMGS(slot.Addr().Interface()).GetAllMeta() |
}, |
setPM: func(slot reflect.Value, pm PropertyMap) error { |
return slot.Addr().Interface().(PropertyLoadSaver).Load(pm) |
@@ -137,7 +137,7 @@ func multiArgTypePLSPtr(et reflect.Type) multiArgType { |
return slot.Interface().(PropertyLoadSaver).Save(true) |
}, |
getMetaPM: func(slot reflect.Value) PropertyMap { |
- return slot.Interface().(PropertyLoadSaver).GetAllMeta() |
+ return getMGS(slot.Interface()).GetAllMeta() |
}, |
setPM: func(slot reflect.Value, pm PropertyMap) error { |
return slot.Interface().(PropertyLoadSaver).Load(pm) |
@@ -164,7 +164,7 @@ func multiArgTypeStruct(et reflect.Type) multiArgType { |
if cdc.problem != nil { |
return multiArgTypeInvalid() |
} |
- toPLS := func(slot reflect.Value) PropertyLoadSaver { |
+ toPLS := func(slot reflect.Value) *structPLS { |
return &structPLS{slot, cdc} |
} |
return multiArgType{ |
@@ -174,13 +174,16 @@ func multiArgTypeStruct(et reflect.Type) multiArgType { |
return newKeyObjErr(aid, ns, toPLS(slot)) |
}, |
getPM: func(slot reflect.Value) (PropertyMap, error) { |
- return toPLS(slot).(PropertyLoadSaver).Save(true) |
+ return toPLS(slot).Save(true) |
}, |
getMetaPM: func(slot reflect.Value) PropertyMap { |
- return toPLS(slot).(PropertyLoadSaver).GetAllMeta() |
+ if slot.Type().Implements(typeOfMGS) { |
+ return slot.Interface().(MetaGetterSetter).GetAllMeta() |
+ } |
+ return toPLS(slot).GetAllMeta() |
}, |
setPM: func(slot reflect.Value, pm PropertyMap) error { |
- return toPLS(slot).(PropertyLoadSaver).Load(pm) |
+ return toPLS(slot).Load(pm) |
}, |
setKey: func(slot reflect.Value, k *Key) { |
setKey(toPLS(slot), k) |
@@ -197,7 +200,7 @@ func multiArgTypeStructPtr(et reflect.Type) multiArgType { |
if cdc.problem != nil { |
return multiArgTypeInvalid() |
} |
- toPLS := func(slot reflect.Value) PropertyLoadSaver { |
+ toPLS := func(slot reflect.Value) *structPLS { |
return &structPLS{slot.Elem(), cdc} |
} |
return multiArgType{ |
@@ -207,13 +210,16 @@ func multiArgTypeStructPtr(et reflect.Type) multiArgType { |
return newKeyObjErr(aid, ns, toPLS(slot)) |
}, |
getPM: func(slot reflect.Value) (PropertyMap, error) { |
- return toPLS(slot).(PropertyLoadSaver).Save(true) |
+ return toPLS(slot).Save(true) |
}, |
getMetaPM: func(slot reflect.Value) PropertyMap { |
- return toPLS(slot).(PropertyLoadSaver).GetAllMeta() |
+ if slot.Elem().Type().Implements(typeOfMGS) { |
+ return getMGS(slot.Interface()).GetAllMeta() |
+ } |
+ return toPLS(slot).GetAllMeta() |
}, |
setPM: func(slot reflect.Value, pm PropertyMap) error { |
- return toPLS(slot).(PropertyLoadSaver).Load(pm) |
+ return toPLS(slot).Load(pm) |
}, |
setKey: func(slot reflect.Value, k *Key) { |
setKey(toPLS(slot), k) |
@@ -237,7 +243,7 @@ func multiArgTypeInterface() multiArgType { |
return pls.Save(true) |
}, |
getMetaPM: func(slot reflect.Value) PropertyMap { |
- pls := mkPLS(slot.Elem().Interface()) |
+ pls := getMGS(slot.Elem().Interface()) |
return pls.GetAllMeta() |
}, |
setPM: func(slot reflect.Value, pm PropertyMap) error { |
@@ -251,7 +257,7 @@ func multiArgTypeInterface() multiArgType { |
} |
func newKeyObjErr(aid, ns string, src interface{}) (*Key, error) { |
- pls := mkPLS(src) |
+ pls := getMGS(src) |
if key, _ := pls.GetMetaDefault("key", nil).(*Key); key != nil { |
return key, nil |
} |
@@ -273,7 +279,7 @@ func newKeyObjErr(aid, ns string, src interface{}) (*Key, error) { |
} |
func setKey(src interface{}, key *Key) { |
- pls := mkPLS(src) |
+ pls := getMGS(src) |
if pls.SetMeta("key", key) == ErrMetaFieldUnset { |
lst := key.LastTok() |
if lst.StringID != "" { |