{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "schema:ProductModel",
  "title": "ProductModel",
  "description": "A datasheet or vendor specification of a product (in the sense of a prototypical description).",
  "type": "object",
  "allOf": [
    {
      "description": "Any offered product or service. For example: a pair of shoes; a concert ticket; the rental of a car; a haircut; or an episode of a TV show streamed online.",
      "$ref": "schema:Product"
    }
  ],
  "properties": {
    "isVariantOf": {
      "description": "Indicates the kind of product that this is a variant of. In the case of [[ProductModel]], this is a pointer (from a ProductModel) to a base product from which this product is a variant. It is safe to infer that the variant inherits all product features from the base model, unless defined locally. This is not transitive. In the case of a [[ProductGroup]], the group description also serves as a template, representing a set of Products that vary on explicitly defined, specific dimensions only (so it defines both a set of variants, as well as which values distinguish amongst those variants). When used with [[ProductGroup]], this property can apply to any [[Product]] included in the group.",
      "oneOf": [
        {
          "anyOf": [
            { "$ref": "schema:ProductGroup" },
            { "$ref": "schema:ProductModel" }
          ]
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              { "$ref": "schema:ProductGroup" },
              { "$ref": "schema:ProductModel" }
            ]
          }
        }
      ]
    },
    "predecessorOf": {
      "description": "A pointer from a previous, often discontinued variant of the product to its newer variant.",
      "oneOf": [
        { "$ref": "schema:ProductModel" },
        { "type": "array", "items": { "$ref": "schema:ProductModel" } }
      ]
    },
    "successorOf": {
      "description": "A pointer from a newer variant of a product  to its previous, often discontinued predecessor.",
      "oneOf": [
        { "$ref": "schema:ProductModel" },
        { "type": "array", "items": { "$ref": "schema:ProductModel" } }
      ]
    }
  }
}
