code: @SuppressWarnings("unchecked")
      @Override
      public synchronized <T> Evaluator<T> createEvaluator(String source, ClassType projection, String[] names,
              Type[] types, Class<?>[] classes, Map<String, Object> constants) {
          try {
              final String id = toId(source, projection.getJavaClass(), types, constants.values());
              Method method = cache.get(id);
                          
              if (method == null) {
                  Class<?> clazz;
                  try {
                      clazz = loader.loadClass(id);
                  } catch (ClassNotFoundException e) {
                      compile(source, projection, names, types, id, constants);
                      // reload
                      clazz = loader.loadClass(id);
                  }
                  method = findEvalMethod(clazz);
                  cache.put(id, method);
              }
              
              return new MethodEvaluator<T>(method, constants, (Class) projection.getJavaClass());
          } catch (ClassNotFoundException e) {
              throw new CodegenException(e);
          } catch (SecurityException e) {
              throw new CodegenException(e);
          } catch (IOException e) {
              throw new CodegenException(e);
          }
      }
docs: Create a new Evaluator instance
  
  @param <T>
  projection type
  @param source
  expression in Java source code form
  @param projection
  type of the source expression
  @param names
  names of the arguments
  @param types
  types of the arguments
  @param constants
  @return