code: func (d *Describers) DescribeObject(exact interface{}, extra ...interface{}) (string, error) {
  	exactType := reflect.TypeOf(exact)
  	fns, ok := d.searchFns[exactType]
  	if !ok {
  		return "", newErrNoDescriber(exactType)
  	}
  	if len(extra) == 0 {
  		for _, typeFn := range fns {
  			if len(typeFn.Extra) == 0 {
  				return typeFn.Describe(exact, extra...)
  			}
  		}
  		typeFn := fns[0]
  		for _, t := range typeFn.Extra {
  			v := reflect.New(t).Elem()
  			extra = append(extra, v.Interface())
  		}
  		return fns[0].Describe(exact, extra...)
  	}
  
  	types := make([]reflect.Type, 0, len(extra))
  	for _, obj := range extra {
  		types = append(types, reflect.TypeOf(obj))
  	}
  	for _, typeFn := range fns {
  		if typeFn.Matches(types) {
  			return typeFn.Describe(exact, extra...)
  		}
  	}
  	return "", newErrNoDescriber(append([]reflect.Type{exactType}, types...)...)
  }
docs: // DescribeObject implements ObjectDescriber and will attempt to print the provided object to a string,
  // if at least one describer function has been registered with the exact types passed, or if any
  // describer can print the exact object in its first argument (the remainder will be provided empty
  // values). If no function registered with Add can satisfy the passed objects, an ErrNoDescriber will
  // be returned
  // TODO: reorder and partial match extra.