public static <GInput, GValue, GValue2> Field<GInput, GValue> convertedField(final Field<? super GInput, GValue2> field,
		final Converter<? super GValue, ? extends GValue2> parser, final Converter<? super GValue2, ? extends GValue> formatter) throws NullPointerException {
		if (field == null) throw new NullPointerException("field = null");
		return new Field<GInput, GValue>() {

			@Override
			public GValue get(final GInput input) {
				if (formatter == null) return null;
				return formatter.convert(field.get(input));
			}

			@Override
			public void set(final GInput input, final GValue value) {
				if (parser == null) return;
				field.set(input, parser.convert(value));
			}

			@Override
			public String toString() {
				return Objects.toInvokeString("convertedField", field, parser, formatter);
			}

		};
	}