class Attribute {

		private final String name;

		private final String value;

		private final Type type;

		private Attribute(String name, String value, Type type) {
			this.name = name;
			this.value = value;
			this.type = type;
		}

		/**
		 * Create an attribute that {@linkplain Type#SET sets} the specified value.
		 * @param name the name of the attribute
		 * @param value the value to set
		 * @return an attribute
		 */
		public static Attribute set(String name, String value) {
			return new Attribute(name, value, Type.SET);
		}

		/**
		 * Create an attribute that {@linkplain Type#APPEND appends} the specified value.
		 * @param name the name of the attribute
		 * @param value the value to append
		 * @return an attribute
		 */
		public static Attribute append(String name, String value) {
			return new Attribute(name, value, Type.APPEND);
		}

		/**
		 * Return the name of the attribute.
		 * @return the name
		 */
		public String getName() {
			return this.name;
		}

		/**
		 * Return the value of the attribute to set or to append.
		 * @return the value
		 */
		public String getValue() {
			return this.value;
		}

		/**
		 * Return the {@link Type} of the attribute.
		 * @return the type
		 */
		public Type getType() {
			return this.type;
		}

		@Override
		public boolean equals(Object o) {
			if (this == o) {
				return true;
			}
			if (o == null || getClass() != o.getClass()) {
				return false;
			}
			Attribute attribute = (Attribute) o;
			return Objects.equals(this.name, attribute.name) && Objects.equals(this.value, attribute.value)
					&& this.type == attribute.type;
		}

		@Override
		public int hashCode() {
			return Objects.hash(this.name, this.value, this.type);
		}

		@Override
		public String toString() {<FILL_FUNCTION_BODY>}

		public enum Type {

			/**
			 * Set the value of the attribute.
			 */
			SET,

			/**
			 * Append the value to the attribute.
			 */
			APPEND;

		}

	}

			return this.name + ((this.type == Type.SET) ? " = " : " += ") + this.value;
		
<no_super_class>