code: func (h *HumanReadablePrinter) PrintObj(obj runtime.Object, output io.Writer) error {
  	// if output is a tabwriter (when it's called by kubectl get), we use it; create a new tabwriter otherwise
  	w, found := output.(*tabwriter.Writer)
  	if !found {
  		w = GetNewTabWriter(output)
  		defer w.Flush()
  	}
  	t := reflect.TypeOf(obj)
  	if handler := h.handlerMap[t]; handler != nil {
  		if !h.options.NoHeaders && t != h.lastType {
  			headers := append(handler.columns, formatWideHeaders(h.options.Wide, t)...)
  			headers = append(headers, formatLabelHeaders(h.options.ColumnLabels)...)
  			// LABELS is always the last column.
  			headers = append(headers, formatShowLabelsHeader(h.options.ShowLabels, t)...)
  			if h.options.WithNamespace {
  				headers = append(withNamespacePrefixColumns, headers...)
  			}
  			h.printHeader(headers, w)
  			h.lastType = t
  		}
  		args := []reflect.Value{reflect.ValueOf(obj), reflect.ValueOf(w), reflect.ValueOf(h.options)}
  		resultValue := handler.printFunc.Call(args)[0]
  		if resultValue.IsNil() {
  			return nil
  		}
  		return resultValue.Interface().(error)
  	}
  	return fmt.Errorf("error: unknown type %#v", obj)
  }
docs: // PrintObj prints the obj in a human-friendly format according to the type of the obj.