docs: private Collection<Object[]> saveDescendantComponentStates(UIComponent parent, boolean iterateFacets,
                                                                 boolean saveChildFacets)
      {
          Collection<Object[]> childStates = null;
          // Index to indicate how many components has been passed without state to save.
          int childEmptyIndex = 0;
          int totalChildCount = 0;
                  
          if (iterateFacets && parent.getFacetCount() > 0)
          {
              Iterator<UIComponent> childIterator = parent.getFacets().values().iterator();
  
              while (childIterator.hasNext())
              {
                  UIComponent child = childIterator.next();
                  if (!child.isTransient())
                  {
                      // Add an entry to the collection, being an array of two
                      // elements. The first element is the state of the children
                      // of this component; the second is the state of the current
                      // child itself.
  
                      if (child instanceof EditableValueHolder)
                      {
                          if (childStates == null)
                          {
                              childStates = new ArrayList<Object[]>(
                                      parent.getFacetCount()
                                      + parent.getChildCount()
                                      - totalChildCount
                                      + childEmptyIndex);
                              for (int ci = 0; ci < childEmptyIndex; ci++)
                              {
                                  childStates.add(LEAF_NO_STATE);
                              }
                          }
                      
                          childStates.add(child.getChildCount() > 0 ? 
                                  new Object[]{new EditableValueHolderState((EditableValueHolder) child),
                                      saveDescendantComponentStates(child, saveChildFacets, true)} :
                                  new Object[]{new EditableValueHolderState((EditableValueHolder) child),
                                      null});
                      }
                      else if (child.getChildCount() > 0 || (saveChildFacets && child.getFacetCount() > 0))
                      {
                          Object descendantSavedState = saveDescendantComponentStates(child, saveChildFacets, true);
                          
                          if (descendantSavedState == null)
                          {
                              if (childStates == null)
                              {
                                  childEmptyIndex++;
                              }
                              else
                              {
                                  childStates.add(LEAF_NO_STATE);
                              }
                          }
                          else
                          {
                              if (childStates == null)
                              {
                                  childStates = new ArrayList<Object[]>(
                                          parent.getFacetCount()
                                          + parent.getChildCount()
                                          - totalChildCount
                                          + childEmptyIndex);
                                  for (int ci = 0; ci < childEmptyIndex; ci++)
                                  {
                                      childStates.add(LEAF_NO_STATE);
                                  }
                              }
                              childStates.add(new Object[]{null, descendantSavedState});
                          }
                      }
                      else
                      {
                          if (childStates == null)
                          {
                              childEmptyIndex++;
                          }
                          else
                          {
                              childStates.add(LEAF_NO_STATE);
                          }
                      }
                  }
                  totalChildCount++;
              }
          }
          
          if (parent.getChildCount() > 0)
          {
              for (int i = 0; i < parent.getChildCount(); i++)
              {
                  UIComponent child = parent.getChildren().get(i);
                  if (!child.isTransient())
                  {
                      // Add an entry to the collection, being an array of two
                      // elements. The first element is the state of the children
                      // of this component; the second is the state of the current
                      // child itself.
  
                      if (child instanceof EditableValueHolder)
                      {
                          if (childStates == null)
                          {
                              childStates = new ArrayList<Object[]>(
                                      parent.getFacetCount()
                                      + parent.getChildCount()
                                      - totalChildCount
                                      + childEmptyIndex);
                              for (int ci = 0; ci < childEmptyIndex; ci++)
                              {
                                  childStates.add(LEAF_NO_STATE);
                              }
                          }
                      
                          childStates.add(child.getChildCount() > 0 ? 
                                  new Object[]{new EditableValueHolderState((EditableValueHolder) child),
                                      saveDescendantComponentStates(child, saveChildFacets, true)} :
                                  new Object[]{new EditableValueHolderState((EditableValueHolder) child),
                                      null});
                      }
                      else if (child.getChildCount() > 0 || (saveChildFacets && child.getFacetCount() > 0))
                      {
                          Object descendantSavedState = saveDescendantComponentStates(child, saveChildFacets, true);
                          
                          if (descendantSavedState == null)
                          {
                              if (childStates == null)
                              {
                                  childEmptyIndex++;
                              }
                              else
                              {
                                  childStates.add(LEAF_NO_STATE);
                              }
                          }
                          else
                          {
                              if (childStates == null)
                              {
                                  childStates = new ArrayList<Object[]>(
                                          parent.getFacetCount()
                                          + parent.getChildCount()
                                          - totalChildCount
                                          + childEmptyIndex);
                                  for (int ci = 0; ci < childEmptyIndex; ci++)
                                  {
                                      childStates.add(LEAF_NO_STATE);
                                  }
                              }
                              childStates.add(new Object[]{null, descendantSavedState});
                          }
                      }
                      else
                      {
                          if (childStates == null)
                          {
                              childEmptyIndex++;
                          }
                          else
                          {
                              childStates.add(LEAF_NO_STATE);
                          }
                      }
                  }
                  totalChildCount++;
              }
          }
          
          return childStates;
      }