synchronized private boolean moreProviders() {
    for (;;) {
      while (classNames == null) {
	if (!configFiles.hasMoreElements())
	  return false;
	classNames = parseConfigFile((URL)configFiles.nextElement());
      }
      while (classNames.hasMoreElements()) {
	String className = (String)classNames.nextElement();
	try {
	  Class cls = loader.loadClass(className);
	  Object obj = cls.newInstance();
	  if (serviceClass.isInstance(obj)) {
	    providers.addElement(obj);
	    return true;
	  }
	}
	catch (ClassNotFoundException e) { }
	catch (InstantiationException e) { }
	catch (IllegalAccessException e) { }
	catch (LinkageError e) { }
      }
      classNames = null;
    }
  }