public T switchAttribute(AttributeIfc attributeIfc) {

    this.lastAttribute = attributeIfc;

    OpenType<?> openType = attributeIfc.getOpenType();

    if (attributeIfc instanceof JavaAttribute) {
      try {
        if (((JavaAttribute) attributeIfc).getTypeDefinition() instanceof BinaryTypeDefinition) {
          return caseJavaBinaryAttribute(openType);
        } else if (((JavaAttribute) attributeIfc).isUnion()) {
          return caseJavaUnionAttribute(openType);
        } else return caseJavaAttribute(openType);
      } catch (UnknownOpenTypeException e) {
        throw getIllegalArgumentException(attributeIfc);
      }

    } else if (attributeIfc instanceof DependencyAttribute) {
      return caseDependencyAttribute(((DependencyAttribute) attributeIfc).getOpenType());
    } else if (attributeIfc instanceof ListAttribute) {
      return caseListAttribute((ArrayType<?>) openType);
    } else if (attributeIfc instanceof ListDependenciesAttribute) {
      return caseListDependeciesAttribute((ArrayType<?>) openType);
    } else if (attributeIfc instanceof TOAttribute) {
      return caseTOAttribute(((TOAttribute) attributeIfc).getOpenType());
    }

    throw getIllegalArgumentException(attributeIfc);
  }
 private IllegalArgumentException getIllegalArgumentException(AttributeIfc attributeIfc) {
   return new IllegalArgumentException(
       "Unknown attribute type "
           + attributeIfc.getClass()
           + ", "
           + attributeIfc
           + " with open type:"
           + attributeIfc.getOpenType());
 }