code: func CascadeEqual(obj Equaler, other Equaler) bool {
  	pc, _, _, ok := runtime.Caller(2)
  	if !ok {
  		return false
  	}
  	if strings.HasSuffix(runtime.FuncForPC(pc).Name(), ".EqualValue") {
  		// We use this indirection so that CascadeEqual can operator
  		// successfully when called again.
  		return EqualValue(obj, other)
  	}
  	return obj.Equal(other)
  }
docs: // CascadeEqual is a helper function that you can use to automatically pick the
  // correct equal function (Equal/EqualValue) depending on how the current equal
  // function is called.
  //
  // CascadeEqual calls obj.EqualValue(other) if the call to the calling function
  // ends was made from a function that ends with ".EqualValue"; otherwise
  // obj.Equal(other) is returned.