code: private void processColumnChildren(FacesContext context, int processAction)
      {
          int first = getFirst();
          int rows = getRows();
          int last;
          if (rows == 0)
          {
              last = getRowCount();
          }
          else
          {
              last = first + rows;
          }
          for (int rowIndex = first; last == -1 || rowIndex < last; rowIndex++)
          {
              setRowIndex(rowIndex);
  
              // scrolled past the last row
              if (!isRowAvailable())
              {
                  break;
              }
              
              for (int i = 0, childCount = getChildCount(); i < childCount; i++)
              {
                  UIComponent child = getChildren().get(i);
                  if (child instanceof UIColumn)
                  {
                      if (! _ComponentUtils.isRendered(context, child))
                      {
                          // Column is not visible
                          continue;
                      }
                      for (int j = 0, columnChildCount = child.getChildCount(); j < columnChildCount; j++)
                      {
                          UIComponent columnChild = child.getChildren().get(j);
                          process(context, columnChild, processAction);
                      }
                  }
              }
          }
      }
docs: Invoke the specified phase on all non-facet children of all UIColumn children of this component. Note that no
  methods are called on the UIColumn child objects themselves.
  
  @param context
  is the current faces context.
  @param processAction
  specifies a JSF phase: decode, validate or update.