public static <GInput, GValue, GOutput> Converter<GInput, GOutput> chainedConverter(final Converter<? super GInput, ? extends GValue> converter1,
		final Converter<? super GValue, ? extends GOutput> converter2) throws NullPointerException {
		if (converter1 == null) throw new NullPointerException("converter1 = null");
		if (converter2 == null) throw new NullPointerException("converter2 = null");
		return new Converter<GInput, GOutput>() {

			@Override
			public GOutput convert(final GInput input) {
				return converter2.convert(converter1.convert(input));
			}

			@Override
			public String toString() {
				return Objects.toInvokeString("chainedConverter", converter1, converter2);
			}

		};
	}