code: private TraversableCodeGenStrategy getTraversableStrategy(JType rawType, Map<String,JClass> directClasses) {
  
          if (rawType.isPrimitive()) {
              // primitive types are never traversable
              return TraversableCodeGenStrategy.NO;
          }
          JClass clazz = (JClass) rawType;
          if (clazz.isParameterized()) {
              // if it's a parameterized type, then we should use the parameter
              clazz = clazz.getTypeParameters().get(0);
              if (clazz.name().startsWith("?")) {
                  // when we have a wildcard we should use the bounding class.
                  clazz = clazz._extends();
              }
          }
          String name = clazz.fullName();
          if (name.equals("java.lang.Object")) {
              // it could be anything so we'll test with an instanceof in the generated code
              return TraversableCodeGenStrategy.MAYBE;
          } else if (clazz.isInterface()) {
              // if it is an interface (like Serializable) it could also be anything
              // handle it like java.lang.Object
              return  TraversableCodeGenStrategy.MAYBE;
          } else if (visitable.isAssignableFrom(clazz)) {
              // it's a real type. if it's one of ours, then it'll be assignable from Visitable
              return TraversableCodeGenStrategy.VISITABLE;
          } else if (directClasses.containsKey(name)) {
              return TraversableCodeGenStrategy.DIRECT;
          } else {
              return TraversableCodeGenStrategy.NO;
          }
      }
docs: Tests to see if the rawType is traversable
  
  @return TraversableCodeGenStrategy VISITABLE, NO, MAYBE, DIRECT
  
  @param rawType