docs: public static <T> RuntimeSchema<T> createFrom(Class<T> typeClass,
              Map<String, String> declaredFields, IdStrategy strategy)
      {
          if (typeClass.isInterface()
                  || Modifier.isAbstract(typeClass.getModifiers()))
          {
              throw new RuntimeException(
                      "The root object can neither be an abstract "
                              + "class nor interface: \"" + typeClass.getName());
          }
  
          final ArrayList<Field<T>> fields = new ArrayList<Field<T>>(
                  declaredFields.size());
          int i = 0;
          for (Map.Entry<String, String> entry : declaredFields.entrySet())
          {
              final java.lang.reflect.Field f;
              try
              {
                  f = typeClass.getDeclaredField(entry.getKey());
              }
              catch (Exception e)
              {
                  throw new IllegalArgumentException("Exception on field: "
                          + entry.getKey(), e);
              }
  
              final int mod = f.getModifiers();
              if (!Modifier.isStatic(mod) && !Modifier.isTransient(mod) && f.getAnnotation(Exclude.class) == null)
              {
                  final Field<T> field = RuntimeFieldFactory.getFieldFactory(
                          f.getType(), strategy).create(++i, entry.getValue(), f,
                          strategy);
                  fields.add(field);
              }
          }
          return new RuntimeSchema<T>(typeClass, fields, RuntimeEnv.newInstantiator(typeClass));
      }