code: @SuppressWarnings("unchecked")
  	@Pure
  	public static <T> Drawer<T> getDrawerFor(Class<? extends T> type) {
  		assert type != null : AssertMessages.notNullParameter();
  		final Drawer<?> bufferedType = buffer.get(type);
  		Drawer<T> defaultChoice = null;
  		if (bufferedType != null) {
  			defaultChoice = (Drawer<T>) bufferedType;
  		} else {
  			final Iterator<Drawer<?>> iterator = getAllDrawers();
  			while (iterator.hasNext()) {
  				final Drawer<?> drawer = iterator.next();
  				final Class<?> drawerType = drawer.getPrimitiveType();
  				if (drawerType.equals(type)) {
  					defaultChoice = (Drawer<T>) drawer;
  					break;
  				} else  if (drawerType.isAssignableFrom(type)
  					&& (defaultChoice == null
  						|| drawerType.isAssignableFrom(defaultChoice.getPrimitiveType()))) {
  					defaultChoice = (Drawer<T>) drawer;
  				}
  			}
  			if (defaultChoice != null) {
  				buffer.put(type, defaultChoice);
  			}
  		}
  		return defaultChoice;
  	}
docs: Replies the first registered document drawer that is supporting the given type.
  
  <p>If multiple drawers handles the given type, the ones handling the top most type
  within the type hierarchy are selected. If there is more than one drawer selected,
  the first encountered is chosen. In this case, there is no warranty about the
  order of the drawers; and the replied drawer may be any of the selected drawers.
  The only assumption that could be done on the order of the drawers is:
  if only one Jar library provides drawers' implementation, then the order of
  the drawers is the same as the order of the types declared within the service's file.
  
  @param <T> the type of the elements to drawer.
  @param type the type of the elements to drawer.
  @return the drawer, or {@code null} if none.