code: public static <V,T,R> Function1<V, R> compose(final Function1<? super T, ? extends R> after, final Function1<? super V, ? extends T> before) {
  		if (after == null)
  			throw new NullPointerException("after");
  		if (before == null)
  			throw new NullPointerException("before");
  		return new Function1<V,R>() {
  			@Override
  			public R apply(V v) {
  				return after.apply(before.apply(v));
  			}
  		};
  	}
docs: Returns a composed function that first applies the {@code before}
  function to its input, and then applies the {@code after} function to the result.
  If evaluation of either function throws an exception, it is relayed to
  the caller of the composed function.
  
  @param <V> the type of input to the {@code before} function, and to the
  composed function
  @param <T> the type of output of the {@code before} function, and input to the
  {@code after} function
  @param <R> the type of output to the {@code after} function, and to the
  composed function
  @param after the function to apply after the before function is applied
  @param before the function to apply before the after function is applied
  @return a composed function that first applies the {@code before}
  function and then applies the {@code after} function
  @throws NullPointerException if {@code before} or {@code after} is <code>null</code>
  
  @see #andThen(Functions.Function1, Functions.Function1)
  @since 2.9