class ClassBasedNavigableIterableAssert<SELF extends ClassBasedNavigableIterableAssert<SELF, ACTUAL, ELEMENT, ELEMENT_ASSERT>,
                                               ACTUAL extends Iterable<? extends ELEMENT>, 
                                               ELEMENT, 
                                               ELEMENT_ASSERT extends AbstractAssert<ELEMENT_ASSERT, ELEMENT>>
       extends AbstractIterableAssert<SELF, ACTUAL, ELEMENT, ELEMENT_ASSERT> {
   private Class<ELEMENT_ASSERT> assertClass;

   
   @SuppressWarnings({ "rawtypes", "unchecked" })
   public static <ACTUAL extends Iterable<? extends ELEMENT>, ELEMENT, ELEMENT_ASSERT extends AbstractAssert<ELEMENT_ASSERT, ELEMENT>>
          ClassBasedNavigableIterableAssert<?, ACTUAL, ELEMENT, ELEMENT_ASSERT> assertThat(ACTUAL actual,
                                                                                           Class<ELEMENT_ASSERT> assertClass) {
     return new ClassBasedNavigableIterableAssert(actual, ClassBasedNavigableIterableAssert.class, assertClass);
   }
   
// @format:on

  public ClassBasedNavigableIterableAssert(ACTUAL actual, Class<?> selfType, Class<ELEMENT_ASSERT> assertClass) {
    super(actual, selfType);
    this.assertClass = assertClass;
  }

  @SuppressWarnings("unchecked")
  @Override
  protected SELF newAbstractIterableAssert(Iterable<? extends ELEMENT> iterable) {
    return (SELF) new ClassBasedNavigableIterableAssert<>(iterable, ClassBasedNavigableIterableAssert.class, assertClass);
  }

  @Override
  public ELEMENT_ASSERT toAssert(ELEMENT value, String description) {
    return buildAssert(value, description, value.getClass());
  }

  private <V> ELEMENT_ASSERT buildAssert(V value, String description, Class<?> clazz) {<FILL_FUNCTION_BODY>}
}

    try {
      Constructor<?>[] declaredConstructors = assertClass.getDeclaredConstructors();
      // find a matching Assert constructor for E or one of its subclass.
      for (Constructor<?> constructor : declaredConstructors) {
        if (constructor.getParameterCount() == 1 && constructor.getParameterTypes()[0].isAssignableFrom(clazz)) {
          @SuppressWarnings("unchecked")
          ELEMENT_ASSERT newAssert = (ELEMENT_ASSERT) constructor.newInstance(value);
          return newAssert.as(description);
        }
      }
      throw new RuntimeException("Failed to find a constructor matching " + value
                                 + " class to build the expected Assert class");
    } catch (Exception e) {
      throw new RuntimeException("Failed to build an assert object with " + value + ": " + e.getMessage(), e);
    }
  
<methods>public SELF allMatch(Predicate<? super ELEMENT>) ,public SELF allMatch(Predicate<? super ELEMENT>, java.lang.String) ,public SELF allSatisfy(Consumer<? super ELEMENT>) ,public SELF allSatisfy(ThrowingConsumer<? super ELEMENT>) ,public SELF anyMatch(Predicate<? super ELEMENT>) ,public SELF anySatisfy(Consumer<? super ELEMENT>) ,public SELF anySatisfy(ThrowingConsumer<? super ELEMENT>) ,public SELF are(Condition<? super ELEMENT>) ,public SELF areAtLeast(int, Condition<? super ELEMENT>) ,public SELF areAtLeastOne(Condition<? super ELEMENT>) ,public SELF areAtMost(int, Condition<? super ELEMENT>) ,public SELF areExactly(int, Condition<? super ELEMENT>) ,public SELF areNot(Condition<? super ELEMENT>) ,public transient SELF as(java.lang.String, java.lang.Object[]) ,public SELF as(org.assertj.core.description.Description) ,public final transient SELF contains(ELEMENT[]) ,public SELF containsAll(Iterable<? extends ELEMENT>) ,public SELF containsAnyElementsOf(Iterable<? extends ELEMENT>) ,public final transient SELF containsAnyOf(ELEMENT[]) ,public final transient SELF containsExactly(ELEMENT[]) ,public SELF containsExactlyElementsOf(Iterable<? extends ELEMENT>) ,public final transient SELF containsExactlyInAnyOrder(ELEMENT[]) ,public SELF containsExactlyInAnyOrderElementsOf(Iterable<? extends ELEMENT>) ,public SELF containsNull() ,public final transient SELF containsOnly(ELEMENT[]) ,public SELF containsOnlyElementsOf(Iterable<? extends ELEMENT>) ,public SELF containsOnlyNulls() ,public final transient SELF containsOnlyOnce(ELEMENT[]) ,public SELF containsOnlyOnceElementsOf(Iterable<? extends ELEMENT>) ,public final transient SELF containsSequence(ELEMENT[]) ,public SELF containsSequence(Iterable<? extends ELEMENT>) ,public final transient SELF containsSubsequence(ELEMENT[]) ,public SELF containsSubsequence(Iterable<? extends ELEMENT>) ,public SELF describedAs(org.assertj.core.description.Description) ,public transient SELF describedAs(java.lang.String, java.lang.Object[]) ,public SELF doNotHave(Condition<? super ELEMENT>) ,public final transient SELF doesNotContain(ELEMENT[]) ,public SELF doesNotContainAnyElementsOf(Iterable<? extends ELEMENT>) ,public SELF doesNotContainNull() ,public final transient SELF doesNotContainSequence(ELEMENT[]) ,public SELF doesNotContainSequence(Iterable<? extends ELEMENT>) ,public final transient SELF doesNotContainSubsequence(ELEMENT[]) ,public SELF doesNotContainSubsequence(Iterable<? extends ELEMENT>) ,public SELF doesNotHave(Condition<? super ACTUAL>) ,public transient SELF doesNotHaveAnyElementsOfTypes(Class<?>[]) ,public SELF doesNotHaveDuplicates() ,public SELF doesNotHaveSameClassAs(java.lang.Object) ,public ELEMENT_ASSERT element(int) ,public ASSERT element(int, InstanceOfAssertFactory<?,ASSERT>) ,public transient SELF elements(int[]) ,public final transient SELF endsWith(ELEMENT, ELEMENT[]) ,public SELF endsWith(ELEMENT[]) ,public AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> extracting(java.lang.String) ,public AbstractListAssert<?,List<? extends P>,P,ObjectAssert<P>> extracting(java.lang.String, Class<P>) ,public transient AbstractListAssert<?,List<? extends org.assertj.core.groups.Tuple>,org.assertj.core.groups.Tuple,ObjectAssert<org.assertj.core.groups.Tuple>> extracting(java.lang.String[]) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> extracting(Function<? super ELEMENT,V>) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> extracting(ThrowingExtractor<? super ELEMENT,V,EXCEPTION>) ,public final transient AbstractListAssert<?,List<? extends org.assertj.core.groups.Tuple>,org.assertj.core.groups.Tuple,ObjectAssert<org.assertj.core.groups.Tuple>> extracting(Function<? super ELEMENT,?>[]) ,public AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> extractingResultOf(java.lang.String) ,public AbstractListAssert<?,List<? extends P>,P,ObjectAssert<P>> extractingResultOf(java.lang.String, Class<P>) ,public SELF filteredOn(java.lang.String, java.lang.Object) ,public SELF filteredOn(java.lang.String, FilterOperator<?>) ,public SELF filteredOn(Condition<? super ELEMENT>) ,public SELF filteredOn(Function<? super ELEMENT,T>, T) ,public SELF filteredOn(Predicate<? super ELEMENT>) ,public SELF filteredOnAssertions(Consumer<? super ELEMENT>) ,public SELF filteredOnAssertions(ThrowingConsumer<? super ELEMENT>) ,public SELF filteredOnNull(java.lang.String) ,public ELEMENT_ASSERT first() ,public ASSERT first(InstanceOfAssertFactory<?,ASSERT>) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> flatExtracting(Function<? super ELEMENT,? extends Collection<V>>) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> flatExtracting(ThrowingExtractor<? super ELEMENT,? extends Collection<V>,EXCEPTION>) ,public final transient AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> flatExtracting(Function<? super ELEMENT,?>[]) ,public final transient AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> flatExtracting(ThrowingExtractor<? super ELEMENT,?,EXCEPTION>[]) ,public AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> flatExtracting(java.lang.String) ,public transient AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> flatExtracting(java.lang.String[]) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> flatMap(Function<? super ELEMENT,? extends Collection<V>>) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> flatMap(ThrowingExtractor<? super ELEMENT,? extends Collection<V>,EXCEPTION>) ,public final transient AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> flatMap(Function<? super ELEMENT,?>[]) ,public final transient AbstractListAssert<?,List<? extends java.lang.Object>,java.lang.Object,ObjectAssert<java.lang.Object>> flatMap(ThrowingExtractor<? super ELEMENT,?,EXCEPTION>[]) ,public SELF has(Condition<? super ACTUAL>) ,public SELF hasAtLeastOneElementOfType(Class<?>) ,public transient SELF hasExactlyElementsOfTypes(Class<?>[]) ,public SELF hasOnlyElementsOfType(Class<?>) ,public transient SELF hasOnlyElementsOfTypes(Class<?>[]) ,public SELF hasOnlyOneElementSatisfying(Consumer<? super ELEMENT>) ,public SELF hasSameClassAs(java.lang.Object) ,public SELF hasSameElementsAs(Iterable<? extends ELEMENT>) ,public SELF hasSameSizeAs(java.lang.Object) ,public SELF hasSameSizeAs(Iterable<?>) ,public SELF hasSize(int) ,public SELF hasSizeBetween(int, int) ,public SELF hasSizeGreaterThan(int) ,public SELF hasSizeGreaterThanOrEqualTo(int) ,public SELF hasSizeLessThan(int) ,public SELF hasSizeLessThanOrEqualTo(int) ,public SELF hasToString(java.lang.String) ,public SELF have(Condition<? super ELEMENT>) ,public SELF haveAtLeast(int, Condition<? super ELEMENT>) ,public SELF haveAtLeastOne(Condition<? super ELEMENT>) ,public SELF haveAtMost(int, Condition<? super ELEMENT>) ,public SELF haveExactly(int, Condition<? super ELEMENT>) ,public SELF inBinary() ,public SELF inHexadecimal() ,public SELF is(Condition<? super ACTUAL>) ,public void isEmpty() ,public SELF isEqualTo(java.lang.Object) ,public SELF isExactlyInstanceOf(Class<?>) ,public SELF isIn(Iterable<?>) ,public transient SELF isIn(java.lang.Object[]) ,public SELF isInstanceOf(Class<?>) ,public transient SELF isInstanceOfAny(Class<?>[]) ,public SELF isNot(Condition<? super ACTUAL>) ,public SELF isNotEmpty() ,public SELF isNotEqualTo(java.lang.Object) ,public SELF isNotExactlyInstanceOf(Class<?>) ,public SELF isNotIn(Iterable<?>) ,public transient SELF isNotIn(java.lang.Object[]) ,public SELF isNotInstanceOf(Class<?>) ,public transient SELF isNotInstanceOfAny(Class<?>[]) ,public SELF isNotNull() ,public transient SELF isNotOfAnyClassIn(Class<?>[]) ,public SELF isNotSameAs(java.lang.Object) ,public void isNullOrEmpty() ,public transient SELF isOfAnyClassIn(Class<?>[]) ,public SELF isSameAs(java.lang.Object) ,public SELF isSubsetOf(Iterable<? extends ELEMENT>) ,public final transient SELF isSubsetOf(ELEMENT[]) ,public ELEMENT_ASSERT last() ,public ASSERT last(InstanceOfAssertFactory<?,ASSERT>) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> map(Function<? super ELEMENT,V>) ,public AbstractListAssert<?,List<? extends V>,V,ObjectAssert<V>> map(ThrowingExtractor<? super ELEMENT,V,EXCEPTION>) ,public final transient AbstractListAssert<?,List<? extends org.assertj.core.groups.Tuple>,org.assertj.core.groups.Tuple,ObjectAssert<org.assertj.core.groups.Tuple>> map(Function<? super ELEMENT,?>[]) ,public SELF noneMatch(Predicate<? super ELEMENT>) ,public SELF noneSatisfy(Consumer<? super ELEMENT>) ,public SELF noneSatisfy(ThrowingConsumer<? super ELEMENT>) ,public transient SELF overridingErrorMessage(java.lang.String, java.lang.Object[]) ,public final transient SELF satisfiesExactly(Consumer<? super ELEMENT>[]) ,public final transient SELF satisfiesExactly(ThrowingConsumer<? super ELEMENT>[]) ,public final transient SELF satisfiesExactlyInAnyOrder(Consumer<? super ELEMENT>[]) ,public final transient SELF satisfiesExactlyInAnyOrder(ThrowingConsumer<? super ELEMENT>[]) ,public SELF satisfiesOnlyOnce(Consumer<? super ELEMENT>) ,public SELF satisfiesOnlyOnce(ThrowingConsumer<? super ELEMENT>) ,public ELEMENT_ASSERT singleElement() ,public ASSERT singleElement(InstanceOfAssertFactory<?,ASSERT>) ,public AbstractIterableSizeAssert<SELF,ACTUAL,ELEMENT,ELEMENT_ASSERT> size() ,public final transient SELF startsWith(ELEMENT[]) ,public SELF usingComparator(Comparator<? super ACTUAL>) ,public SELF usingComparator(Comparator<? super ACTUAL>, java.lang.String) ,public transient SELF usingComparatorForElementFieldsWithNames(Comparator<T>, java.lang.String[]) ,public SELF usingComparatorForElementFieldsWithType(Comparator<T>, Class<T>) ,public SELF usingComparatorForType(Comparator<T>, Class<T>) ,public SELF usingDefaultComparator() ,public SELF usingDefaultElementComparator() ,public SELF usingElementComparator(Comparator<? super ELEMENT>) ,public transient SELF usingElementComparatorIgnoringFields(java.lang.String[]) ,public transient SELF usingElementComparatorOnFields(java.lang.String[]) ,public SELF usingFieldByFieldElementComparator() ,public org.assertj.core.api.RecursiveAssertionAssert usingRecursiveAssertion() ,public org.assertj.core.api.RecursiveAssertionAssert usingRecursiveAssertion(org.assertj.core.api.recursive.assertion.RecursiveAssertionConfiguration) ,public RecursiveComparisonAssert<?> usingRecursiveComparison() ,public RecursiveComparisonAssert<?> usingRecursiveComparison(org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration) ,public SELF usingRecursiveFieldByFieldElementComparator() ,public SELF usingRecursiveFieldByFieldElementComparator(org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration) ,public transient SELF usingRecursiveFieldByFieldElementComparatorIgnoringFields(java.lang.String[]) ,public transient SELF usingRecursiveFieldByFieldElementComparatorOnFields(java.lang.String[]) ,public transient SELF withFailMessage(java.lang.String, java.lang.Object[]) ,public SELF withThreadDumpOnError() ,public SELF zipSatisfy(Iterable<OTHER_ELEMENT>, BiConsumer<? super ELEMENT,OTHER_ELEMENT>) <variables>private static final java.lang.String ASSERT,private org.assertj.core.internal.TypeComparators comparatorsByType,private Map<java.lang.String,Comparator<?>> comparatorsForElementPropertyOrFieldNames,private org.assertj.core.internal.TypeComparators comparatorsForElementPropertyOrFieldTypes,protected org.assertj.core.internal.Iterables iterables