code: public <T> List<Class<? extends T>> getImplementations(final Class<T> clazz, Predicate<Class<? extends T>> predicate)
  	{
  		final long started = System.currentTimeMillis();
  		try
  		{
  			if (clazz.isInterface())
  				return filter(finder.findImplementations(clazz), predicate);
  			else
  				return filter(finder.findSubclasses(clazz), predicate);
  		}
  		finally
  		{
  			final long finished = System.currentTimeMillis();
  			searchTime.addAndGet(finished - started);
  
  			if (log.isTraceEnabled())
  				log.trace("getExtendingClasses " +
  				          clazz +
  				          " with predicate=" +
  				          predicate +
  				          " returned in " +
  				          (finished - started) +
  				          " ms");
  		}
  	}
docs: Find filtered implementations of an interface (if an interface is provided) or extensions (if a class is provided)
  @param clazz
  @param predicate the predicate to use to filter the implementations
  @param <T>
  @return