code: func (d *Describers) Add(fns ...interface{}) error {
  	for _, fn := range fns {
  		fv := reflect.ValueOf(fn)
  		ft := fv.Type()
  		if ft.Kind() != reflect.Func {
  			return fmt.Errorf("expected func, got: %v", ft)
  		}
  		numIn := ft.NumIn()
  		if numIn == 0 {
  			return fmt.Errorf("expected at least one 'in' params, got: %v", ft)
  		}
  		if ft.NumOut() != 2 {
  			return fmt.Errorf("expected two 'out' params - (string, error), got: %v", ft)
  		}
  		types := make([]reflect.Type, 0, numIn)
  		for i := 0; i < numIn; i++ {
  			types = append(types, ft.In(i))
  		}
  		if ft.Out(0) != reflect.TypeOf(string("")) {
  			return fmt.Errorf("expected string return, got: %v", ft)
  		}
  		var forErrorType error
  		// This convolution is necessary, otherwise TypeOf picks up on the fact
  		// that forErrorType is nil.
  		errorType := reflect.TypeOf(&forErrorType).Elem()
  		if ft.Out(1) != errorType {
  			return fmt.Errorf("expected error return, got: %v", ft)
  		}
  
  		exact := types[0]
  		extra := types[1:]
  		if d.searchFns == nil {
  			d.searchFns = make(map[reflect.Type][]typeFunc)
  		}
  		fns := d.searchFns[exact]
  		fn := typeFunc{Extra: extra, Fn: fv}
  		fns = append(fns, fn)
  		d.searchFns[exact] = fns
  	}
  	return nil
  }
docs: // Add adds one or more describer functions to the describe.Describer. The passed function must
  // match the signature:
  //
  //     func(...) (string, error)
  //
  // Any number of arguments may be provided.