docs: public Object newInstance( String name, Object[] params, String[] types ) throws ClassLoaderException {
          Class<?> clazz;
          try {
              clazz = loadClass(name);
          } catch (ClassNotFoundException e) {
              throw new ClassLoaderException(e);
          }
          
          List<Class> paramTypes = new ArrayList<Class>();
          
          if ( types != null ) {
              for( String type: types ) {
                  try {
                      paramTypes.add( loadClass(type) );
                  } catch (ClassNotFoundException e) {
                      throw new ClassLoaderException(e);
                  }
              }
          } else if ( params != null ) {
              for ( Object param: params ) {
                  paramTypes.add( param.getClass() );
              }
          } 
          
          if ( params != null ) {
              Constructor<?> constructor;
              try {
                  constructor = clazz.getConstructor( paramTypes.toArray( new Class[paramTypes.size()] ) );
              } catch (SecurityException e) {
                  throw new ClassLoaderException("Private constructor for " + clazz.getSimpleName(), e);
              } catch (NoSuchMethodException e) {
                  throw new ClassLoaderException("No such constructor for " + clazz.getSimpleName(), e);
              } catch (Exception e) {
                  throw new ClassLoaderException("Attempted to access constructor for " + clazz.getSimpleName(), e);
              }
              
              try {
                  return constructor.newInstance(params);
              } catch (IllegalArgumentException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (InstantiationException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (IllegalAccessException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (InvocationTargetException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (Exception e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              }
  
          } else {
              Constructor<?> constructor;
              try {
                  constructor = clazz.getConstructor();
              } catch (SecurityException e) {
                  throw new ClassLoaderException("Private constructor for " + clazz.getSimpleName(),e);
              } catch (NoSuchMethodException e) {
                  throw new ClassLoaderException("No such constructor for " + clazz.getSimpleName(),e);
              } catch (Exception e) {
                  throw new ClassLoaderException("Attempted to access constructor for " + clazz.getSimpleName(), e);
              }
              
              try {
                  return constructor.newInstance();
              } catch (IllegalArgumentException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (InstantiationException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (IllegalAccessException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (InvocationTargetException e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              } catch (Exception e) {
                  throw new ClassLoaderException("Attempted to created new instance of " + clazz.getSimpleName(),e);
              }
          }
      }