/**
   * Validates a collection of anything splitable. This implies that it contains <code>
   * {@link CreditSplit}</code> instances.
   *
   * @param splitable_it
   * @param creditType
   * @param greaterCummulative
   * @return boolean is valid?
   */
  public boolean validateCreditSplitable(
      Iterator<? extends CreditSplitable> splitable_it,
      InvestigatorCreditType creditType,
      DecimalHolder greaterCummulative) {
    if (!splitable_it.hasNext()) {
      return isCreditSplitTotalValid(greaterCummulative.getValue());
    }
    boolean retval = true;

    CreditSplitable splitable = splitable_it.next();
    info(VALIDATING_MESSAGE, getCreditSplitableName(splitable));

    DecimalHolder lesserCummulative = new DecimalHolder(KualiDecimal.ZERO);
    retval &=
        validateCreditSplit(splitable.getCreditSplits().iterator(), creditType, lesserCummulative);

    greaterCummulative.add(lesserCummulative);

    return retval & validateCreditSplitable(splitable_it, creditType, greaterCummulative);
  }
  /**
   * Discover the name of a {@link CreditSplitable}. Not all {@link CreditSplitable} instances will
   * have a <code>name</code> property. Even if they did, it's not likely for all the properties to
   * be called <code>name</code>. {@link CreditSplitable} relies on a property to be annotated as
   * being the name of the {@link CreditSplitable}. This checks for that annotation and returns the
   * name.
   *
   * @param splitable
   * @return <code>null</code> if the name could not be found or if the value of the name is also
   *     <code>null</code>; otherwise, the name is returned.
   */
  private String getCreditSplitableName(CreditSplitable splitable) {

    for (Method method : splitable.getClass().getMethods()) {
      if (method.isAnnotationPresent(CreditSplitNameInfo.class)) {
        LOG.info("Found method name " + method.getName());
        try {
          return (String) method.invoke(splitable, null);
        } catch (Exception e) {
          LOG.warn(
              "Could not find the name property for the credit splitable object of class "
                  + splitable.getClass().getName()
                  + ". Make sure the "
                  + CreditSplitNameInfo.class.getSimpleName()
                  + " annotation is declared on the name property of "
                  + splitable.getClass().getSimpleName());
        }
      }
    }

    return null;
  }