         self.client = client
     }
     
+    /**
+     Create a product
+     Creates a new product object.
+     
+     - parameter name:              The product’s name, meant to be displayable to the customer.
+     - parameter id:                The identifier for the product. Must be unique. If not provided, 
+                                    an identifier will be randomly generated.
+     - parameter active:            Whether or not the product is currently available for purchase. 
+                                    Defaults to true.
+     - parameter attributes:        A list of up to 5 alphanumeric attributes that each SKU can provide 
+                                    values for (e.g. ["color", "size"]).
+     - parameter caption:           A short one-line description of the product, meant to be displayable 
+                                    to the customer.
+     - parameter deactivateOn:      An array of Connect application names or identifiers that should not 
+                                    be able to order the SKUs for this product.
+     - parameter description:       The product’s description, meant to be displayable to the customer.
+     - parameter images:            A list of up to 8 URLs of images for this product, meant to be displayable 
+                                    to the customer.
+     - parameter packageDimensions: The dimensions of this product for shipping purposes. A SKU associated with 
+                                    this product can override this value by having its own package_dimensions.
+     - parameter shippable:         Whether this product is shipped (i.e. physical goods). Defaults to true.
+     - parameter url:               A URL of a publicly-accessible webpage for this product.
+     - parameter metadata:          A set of key/value pairs that you can attach to a product object. It can be 
+                                    useful for storing additional information about the product in a structured format.
+     
+     - returns: A StripeRequest<> item which you can then use to convert to the corresponding node
+     */
     public func create(name: String, id: String?, active: Bool? = nil, attributes: Node? = nil, caption: String? = nil, deactivateOn: Node? = nil, description: String? = nil, images: Node? = nil, packageDimensions: Node? = nil, shippable: Bool? = nil, url: String? = nil, metadata: Node? = nil) throws -> StripeRequest<Product> {
     
         var body = Node([:])

        return try StripeRequest(client: self.client, method: .get, route: .product, query: query, body: nil, headers: nil)
    }
    
    public func delete(product productId: String) throws -> StripeRequest<DeletedObject> {
        return try StripeRequest(client: self.client, method: .delete, route: .products(productId), query: [:], body: nil, headers: nil)
    }

        return try StripeRequest(client: self.client, method: .post, route: .products(productId), query: [:], body: Body.data(body.formURLEncoded()), headers: nil)
    }
    
    /**
     List all products
     Returns a list of your products. The products are returned sorted by creation date, with the 
     most recently created products appearing first.
     
     - parameter filter: A Filter item to pass query parameters when fetching results
     
     - returns: A StripeRequest<> item which you can then use to convert to the corresponding node
     */
    public func listAll(filter: StripeFilter? = nil) throws -> StripeRequest<ProductsList> {
        var query = [String : NodeRepresentable]()
        if let data = try filter?.createQuery() {
