code: func isRemoteMethod(method reflect.Method) bool {
  	mt := method.Type
  	// Method must be exported.
  	if method.PkgPath != "" {
  		return false
  	}
  
  	// Method needs at least two ins: receiver and context.Context
  	if mt.NumIn() != 2 && mt.NumIn() != 3 {
  		return false
  	}
  
  	if t1 := mt.In(1); !t1.Implements(typeOfContext) {
  		return false
  	}
  
  	if mt.NumIn() == 3 {
  		if t2 := mt.In(2); !t2.Implements(typeOfProtoMsg) {
  			return false
  		}
  	}
  
  	// Method needs two outs: interface{}(that implements proto.Message), error
  	if mt.NumOut() != 2 {
  		return false
  	}
  
  	if (mt.Out(0).Kind() != reflect.Ptr) || mt.Out(1) != typeOfError {
  		return false
  	}
  
  	if o0 := mt.Out(0); !o0.Implements(typeOfProtoMsg) {
  		return false
  	}
  
  	return true
  }
docs: // isRemoteMethod decide a method is suitable remote method