 	}
 
 	description += "(\(T.name))"
+
+	if option.defaultValue != nil {
+		description += "]"
+	}
+
+	description += "\n\t\(option.usage)"
+	return CarthageError.InvalidArgument(description: description).error
+}
+
+/// Constructs an `InvalidArgument` error that describes how to use the
+/// given boolean option.
+private func informativeUsageError(option: Option<Bool>) -> NSError {
+	precondition(option.key != nil)
+
+	var description = ""
+
+	if option.defaultValue != nil {
+		description += "["
+	}
+
+	description += "--(no-)\(option.key!)"
 
 	if option.defaultValue != nil {
 		description += "]"

		}
	}

	/// Returns whether the given key was passed as a flag.
	///
	/// If the key is found, it is then removed from the list of arguments
	/// remaining to be parsed.
	private func consumeKey(key: String) -> Bool {
		let oldArguments = rawArguments
		rawArguments.removeAll()

		var found = false
		for arg in oldArguments {
			if arg == .Key(key) {
				found = true
			} else {
				rawArguments.append(arg)
			}
		}

		return found
	}

	/// Returns the value associated with the given flag, or nil if the flag was

		return failure(informativeUsageError(option))
	}
}

/// Evaluates the given boolean option in the given mode.
///
/// If parsing command line arguments, and no value was specified on the command
/// line, the option's `defaultValue` is used.
public func <|(mode: CommandMode, option: Option<Bool>) -> Result<Bool> {
	precondition(option.key != nil)

	switch mode {
	case let .Arguments(arguments):
		if let value = arguments.consumeBooleanKey(option.key!) {
			return success(value)
		} else if let defaultValue = option.defaultValue {
			return success(defaultValue)
		} else {
			return failure(missingArgumentError(option.description))
		}

	case .Usage:
		return failure(informativeUsageError(option))
	}
}
