fmt.Println("obj is a", reflect.TypeOf(obj).Name())
// Must take the value on the pointer to the object (see laws of reflection)
v := reflect.ValueOf(&obj)
// Create a pointer type to the underlying element type
ptrtype := reflect.PtrTo(reflect.TypeOf(obj))
fmt.Println("ptrtype is", ptrtype)
// Convert the *interface{} to a *Cat
vp := v.Convert(ptrtype)
// NOTE: `v.Convert(ptrtype)` fails with:
//
// panic: reflect.Value.Convert: value of type *interface {} cannot be converted to type *main.Cat
//