public <T> Macros with(Class<T> type, Macro<? extends T> macro) {
    """
	Uses the given {@link Macro} for the given exact (no super-types!) type
	of values.
	
	@param type The type of value that should be passed to the {@link Macro}
	as value
	@param macro The {@link Macro} expanding the type of value
	@return A set of {@link Macros} containing the given one
    """
		int index = index(type);
		if (index >= 0) {
			Macro<?>[] tmp = macros.clone();
			tmp[index] = macro;
			return new Macros(types, tmp);
		}
		return new Macros(arrayPrepand(type, types),
				arrayPrepand(macro, macros));
	}
public <T> Macros with(Class<T> type, Macro<? extends T> macro) {
		int index = index(type);
		if (index >= 0) {
			Macro<?>[] tmp = macros.clone();
			tmp[index] = macro;
			return new Macros(types, tmp);
		}
		return new Macros(arrayPrepand(type, types),
				arrayPrepand(macro, macros));
	}
public < T > Macros with ( Class < T > type , Macro < ? extends T > macro ) { int index = index ( type ) ; if ( index >= 0 ) { Macro < ? > [ ] tmp = macros . clone ( ) ; tmp [ index ] = macro ; return new Macros ( types , tmp ) ; } return new Macros ( arrayPrepand ( type , types ) , arrayPrepand ( macro , macros ) ) ; }
Uses the given {@link Macro} for the given exact (no super-types!) type
of values.

@param type The type of value that should be passed to the {@link Macro}
as value
@param macro The {@link Macro} expanding the type of value
@return A set of {@link Macros} containing the given one
Uses the given { @link Macro } for the given exact ( no super - types! ) type of values .