docs: def _build_table(self, info, order, max_col_len=40, only_changed=False):
          """
          Collect the information about parameters needed to build a
          properly formatted table and then tabulate it.
          """
  
          info_dict, bounds_dict = {}, {}
          (params, val_dict, changed) = info
          col_widths = dict((k,0) for k in order)
  
          for name, p in params.items():
              if only_changed and not (name in changed):
                  continue
  
              constant = 'C' if p.constant else 'V'
              readonly = 'RO' if p.readonly else 'RW'
              allow_None = ' AN' if hasattr(p, 'allow_None') and p.allow_None else ''
  
              mode = '%s %s%s' % (constant, readonly, allow_None)
              info_dict[name] = {'name': name, 'type':p.__class__.__name__,
                                 'mode':mode}
  
              if hasattr(p, 'bounds'):
                  lbound, ubound = (None,None) if p.bounds is None else p.bounds
  
                  mark_lbound, mark_ubound = False, False
                  # Use soft_bounds when bounds not defined.
                  if hasattr(p, 'get_soft_bounds'):
                      soft_lbound, soft_ubound = p.get_soft_bounds()
                      if lbound is None and soft_lbound is not None:
                          lbound = soft_lbound
                          mark_lbound = True
                      if ubound is None and soft_ubound is not None:
                          ubound = soft_ubound
                          mark_ubound = True
  
                  if (lbound, ubound) != (None,None):
                      bounds_dict[name] = (mark_lbound, mark_ubound)
                      info_dict[name]['bounds'] = '(%s, %s)' % (lbound, ubound)
  
              value = repr(val_dict[name])
              if len(value) > (max_col_len - 3):
                  value = value[:max_col_len-3] + '...'
              info_dict[name]['value'] = value
  
              for col in info_dict[name]:
                  max_width = max([col_widths[col], len(info_dict[name][col])])
                  col_widths[col] = max_width
  
          return self._tabulate(info_dict, col_widths, changed, order, bounds_dict)