docs: protected void record( final Type type,
                             final String typeNodeName,
                             final Node parentNode ) throws Exception {
          if (type.isSimpleType()) {
              final Node typeNode = parentNode.addNode(typeNodeName, ClassFileSequencerLexicon.SIMPLE_TYPE);
              typeNode.setProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME, getTypeName(type));
              LOGGER.debug("Simple type created at '{0}'", typeNode.getPath());
          } else if (type.isPrimitiveType()) {
              final Node typeNode = parentNode.addNode(typeNodeName, ClassFileSequencerLexicon.PRIMITIVE_TYPE);
              typeNode.setProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME, getTypeName(type));
              LOGGER.debug("Primitive type created at '{0}'", typeNode.getPath());
          } else if (type.isArrayType()) {
              final Node typeNode = parentNode.addNode(typeNodeName, ClassFileSequencerLexicon.ARRAY_TYPE);
              typeNode.setProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME, getTypeName(type));
  
              final ArrayType arrayType = ((ArrayType)type);
              typeNode.setProperty(ClassFileSequencerLexicon.DIMENSIONS, arrayType.getDimensions());
  
              final Type componentType = arrayType.getComponentType();
              record(componentType, ClassFileSequencerLexicon.COMPONENT_TYPE, typeNode);
              LOGGER.debug("Array type created at '{0}'", typeNode.getPath());
          } else if (type.isParameterizedType()) {
              final Node typeNode = parentNode.addNode(typeNodeName, ClassFileSequencerLexicon.PARAMETERIZED_TYPE);
              typeNode.setProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME, getTypeName(type));
  
              final ParameterizedType paramType = (ParameterizedType)type;
              final Type baseType = paramType.getType();
              record(baseType, ClassFileSequencerLexicon.BASE_TYPE, typeNode);
  
              @SuppressWarnings( "unchecked" )
              final List<Type> arguments = ((ParameterizedType)type).typeArguments();
  
              if ((arguments != null) && !arguments.isEmpty()) {
                  final Node containerNode = typeNode.addNode(ClassFileSequencerLexicon.ARGUMENTS, ClassFileSequencerLexicon.TYPES);
  
                  for (final Type arg : arguments) {
                      record(arg, ClassFileSequencerLexicon.ARGUMENT, containerNode);
                  }
              }
  
              LOGGER.debug("Parameterized type created at '{0}'", typeNode.getPath());
          } else if (type.isQualifiedType()) {
              final Node typeNode = parentNode.addNode(typeNodeName, ClassFileSequencerLexicon.QUALIFIED_TYPE);
              typeNode.setProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME, getTypeName(type));
  
              final QualifiedType qualifiedType = (QualifiedType)type;
              record(qualifiedType.getQualifier(), ClassFileSequencerLexicon.QUALIFIER, typeNode);
              LOGGER.debug("Qualified type created at '{0}'", typeNode.getPath());
          } else if (type.isWildcardType()) {
              final Node typeNode = parentNode.addNode("?", ClassFileSequencerLexicon.WILDCARD_TYPE);
              typeNode.setProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME, getTypeName(type));
  
              final WildcardType wildcardType = (WildcardType)type;
              final String bound = wildcardType.isUpperBound() ? ClassFileSequencerLexicon.WildcardTypeBound.UPPER.toString() : ClassFileSequencerLexicon.WildcardTypeBound.LOWER.toString();
              typeNode.setProperty(ClassFileSequencerLexicon.BOUND_TYPE, bound);
  
              if (wildcardType.getBound() != null) {
                  record(wildcardType.getBound(), ClassFileSequencerLexicon.BOUND, typeNode);
              }
  
              LOGGER.debug("Wildcard type created at '{0}'", typeNode.getPath());
          } else {
              assert false;
              LOGGER.error(JavaFileI18n.unhandledType, type.getClass().getName(), typeNodeName);
          }
      }