code: protected ValueReader createReader(Class<?> contextType, Class<?> type, Type genericType)
      {
          if (type == Object.class) {
              return AnyReader.std;
          }
          if (type.isArray()) {
              Class<?> elemType = type.getComponentType();
              if (!elemType.isPrimitive()) {
                  return new ArrayReader(elemType, createReader(contextType, elemType, elemType));
              }
              int typeId = _findSimpleType(type, false);
              if (typeId > 0) {
                  return new SimpleValueReader(typeId, type);
              }
              throw new IllegalArgumentException("Deserialization of "+type.getName()+" not (yet) supported");
          }
          if (type.isEnum()) {
              return enumReader(type);
          }
          if (Collection.class.isAssignableFrom(type)) {
              return collectionReader(contextType, genericType);
          }
          if (Map.class.isAssignableFrom(type)) {
              return mapReader(contextType, genericType);
          }
          int typeId = _findSimpleType(type, false);
          if (typeId > 0) {
              return new SimpleValueReader(typeId, type);
          }
          // Beans!
          final ClassKey key = new ClassKey(type, _features);
          synchronized (_readerLock) {
              if (_incompleteReaders == null) {
                  _incompleteReaders = new HashMap<ClassKey, ValueReader>();
              } else { // perhaps it has already been resolved?
                  ValueReader vr = _incompleteReaders.get(key);
                  if (vr != null) {
                      return vr;
                  }
              }
              BeanReader def = _resolveBeanForDeser(type);
              try {
                  _incompleteReaders.put(key, def);
                  for (Map.Entry<String, BeanPropertyReader> entry : def.propertiesByName().entrySet()) {
                      BeanPropertyReader prop = entry.getValue();
                      entry.setValue(prop.withReader(createReader(contextType,
                              prop.rawSetterType(), prop.genericSetterType())));
                  }
                  def.initFieldMatcher(_streamFactory);
              } finally {
                  _incompleteReaders.remove(key);
              }
              return def;
          }
      }
docs: /*
  ********************************************************************
  /* Factory method(s) for Beans:
  ********************************************************************