code: func callMethod(data reflect.Value, name string) (result reflect.Value, found bool) {
      found = false
      // Method set depends on pointerness, and the value may be arbitrarily
      // indirect.  Simplest approach is to walk down the pointer chain and
      // see if we can find the method at each step.
      // Most steps will see NumMethod() == 0.
      for {
          typ := data.Type()
          if nMethod := data.Type().NumMethod(); nMethod > 0 {
              for i := 0; i < nMethod; i++ {
                  method := typ.Method(i)
                  if method.Name == name {
  
                      found = true // we found the name regardless
                      // does receiver type match? (pointerness might be off)
                      if typ == method.Type.In(0) {
                          return call(data, method), found
                      }
                  }
              }
          }
          if nd := data; nd.Kind() == reflect.Ptr {
              data = nd.Elem()
          } else {
              break
          }
      }
      return
  }
docs: // See if name is a method of the value at some level of indirection.
  // The return values are the result of the call (which may be nil if
  // there's trouble) and whether a method of the right name exists with
  // any signature.