 		return requestor.request(resource: resource, connectedApp: connectedApp).asVoid()
 	}
 	
+	open func delete(record: Record) -> Promise<Void> {
+		guard let id = record.id else {
+			return Promise(error: ApplicationError.invalidState(message: "Missing record ID"))
+		}
+		return delete(type: record.type, id: id)
+	}
+	
+	// MARK: - Describe methods
+	
 	/// Asynchronously retrieves metadata about a Salesforce object and its fields.
 	/// See: https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_describe.htm
 	/// - Parameter type: Object name

	/// See https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_query.htm
	/// - Parameter soql: Array of SOQL queries
	/// - Returns: Promise of an array of QueryResults, in the same order as the "soql" parameter
	open func query(soql: [String]) -> Promise<[QueryResult<SObject>]> {
		let promises: [Promise<QueryResult<SObject>>] = soql.map { query(soql: $0) }
		return when(fulfilled: promises)
	}
	

	/// Asynchronsouly executes a SOQL query
	/// See https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_query.htm
	/// - Parameter soql: SOQL query
	/// - Returns: Promise of a QueryResult whose records, if any, are decoded as Records
	open func query(soql: String) -> Promise<QueryResult<Record>> {
		let resource = Resource.query(soql: soql, version: version)
		return requestor.request(resource: resource, connectedApp: connectedApp).then(on: q) {
			return try self.decoder.decode(QueryResult<Record>.self, from: $0)
		}
	}
	
