code: func (s *Service) ExtractHandler() error {
  	typeName := reflect.Indirect(s.Receiver).Type().Name()
  	if typeName == "" {
  		return errors.New("no service name for type " + s.Type.String())
  	}
  	if !isExported(typeName) {
  		return errors.New("type " + typeName + " is not exported")
  	}
  
  	// Install the methods
  	s.Handlers = suitableHandlerMethods(s.Type, s.Options.nameFunc)
  
  	if len(s.Handlers) == 0 {
  		str := ""
  		// To help the user, see if a pointer receiver would work.
  		method := suitableHandlerMethods(reflect.PtrTo(s.Type), s.Options.nameFunc)
  		if len(method) != 0 {
  			str = "type " + s.Name + " has no exported methods of handler type (hint: pass a pointer to value of that type)"
  		} else {
  			str = "type " + s.Name + " has no exported methods of handler type"
  		}
  		return errors.New(str)
  	}
  
  	for i := range s.Handlers {
  		s.Handlers[i].Receiver = s.Receiver
  	}
  
  	return nil
  }
docs: // ExtractHandler extract the set of methods from the
  // receiver value which satisfy the following conditions:
  // - exported method of exported type
  // - one or two arguments
  // - the first argument is context.Context
  // - the second argument (if it exists) is []byte or a pointer
  // - zero or two outputs
  // - the first output is [] or a pointer
  // - the second output is an error