@SuppressWarnings({ "rawtypes", "unchecked" })
  void addTypeMapper(String prop, Mapper<? super S, Class> typeMapper,
              Map<String, ? extends Collection<Class<?>>> typeFilters) 
                  throws NoSuchFieldException {
    if (prop.isEmpty()) {
      this.typeMapper = typeMapper;
      return;
    }
    validateProperty(prop);
    String first = splitProperty(prop)[0];
    String rest = splitProperty(prop)[1];
    Collection<Class<?>> types = typeFilters.get("");
    if (types == null) {
      types = singleton(rootType);
    }
    for (Class<?> type : types) {
      PropMapper pm = findOrCreateMapper(type, first);
      ((BeanMapper<S, ?>) pm.mapper)
          .addTypeMapper(ifNull(rest, ""), typeMapper, shiftTypeMap(first, typeFilters));
    }
  }