code: public static <T extends Annotation> List<Entry<T, Object>> onParams(final Class<T> type, InvocationContext context) {
  		 
  		assertNotNull(type);
  		assertNotNull(context);
  		
  		List<Entry<T, Object>> metadata = new ArrayList<Entry<T, Object>>();
  			
  		Method request = context.getRequest();
  		List<Object> paramValues = context.getArguments();
  		
  		Annotation[][] annotationsForAllParams = request.getParameterAnnotations();
  		
  		for (int i = 0; i < annotationsForAllParams.length; i++) {
  			
  			final Object value = paramValues.get(i);
  			
  			if(value == null) {
  				
  				continue;
  			}
  			
  			for (final Annotation annotation : annotationsForAllParams[i]) {
  				
  				if(type.isAssignableFrom(annotation.getClass())) {
  					
  					metadata.add(new Map.Entry<T, Object>() {
  
  						@Override
  						public T getKey() {
  							
  							return type.cast(annotation);
  						}
  
  						@Override
  						public Object getValue() {
  							
  							return value;
  						}
  
  						@Override
  						public Object setValue(Object value) {
  							
  							throw new UnsupportedOperationException();
  						}
  					});
  					
  					break;
  				}
  			}
  		}
  		
  		return Collections.unmodifiableList(metadata);
  	 }
docs: <p>Finds all parameters on the request definition which are annotated with the given type and returns
  the annotation instance together with the runtime argument.</p>
  
  @param type
  the {@link Class} of the annotation to look for on the request parameters
  <br><br>
  @param context
  the {@link InvocationContext} containing the request definition to extract the metadata from
  <br><br>
  @return an <b>unmodifiable</b> {@link List} of {@link Map.Entry} instances with the annotation as
  the and the runtime argument as the <i>value</i>; <b>note</b> that the implementation of
  {@link Map.Entry#setValue(Object)} throws an {@link UnsupportedOperationException}
  <br><br>
  @since 1.3.0