public static <GInput, GOutput, GValue> Field<GInput, GValue> navigatedField(final Converter<? super GInput, ? extends GOutput> converter,
		final Field<? super GOutput, GValue> field) throws NullPointerException {
		if (converter == null) throw new NullPointerException("converter = null");
		if (field == null) throw new NullPointerException("field = null");
		return new Field<GInput, GValue>() {

			@Override
			public GValue get(final GInput input) {
				return field.get(converter.convert(input));
			}

			@Override
			public void set(final GInput input, final GValue value) {
				field.set(converter.convert(input), value);
			}

			@Override
			public String toString() {
				return Objects.toInvokeString("navigatedField", converter, field);
			}

		};
	}