{
    "bmm_version": "2.4",
    "rm_publisher": "openehr",
    "schema_name": "lang",
    "rm_release": "1.1.0",
    "schema_revision": "1.1.0.2",
    "schema_lifecycle_state": "stable",
    "schema_description": "lang",
    "schema_author": "Thomas Beale <thomas.beale@openehr.org>, code-generator",
    "includes": {
        "openehr_base_1.3.0": {
            "id": "openehr_base_1.3.0"
        }
    },
    "packages": {
        "org.openehr.lang.bmm": {
            "name": "org.openehr.lang.bmm",
            "packages": {
                "core": {
                    "name": "core",
                    "classes": [
                        "BMM_DEFINITIONS",
                        "BMM_MODEL_ELEMENT",
                        "BMM_CLASSIFIER",
                        "BMM_CLASS",
                        "BMM_GENERIC_CLASS",
                        "BMM_ENUMERATION",
                        "BMM_ENUMERATION_INTEGER",
                        "BMM_ENUMERATION_STRING",
                        "BMM_TYPE_ELEMENT",
                        "BMM_TYPE",
                        "BMM_SIMPLE_TYPE",
                        "BMM_OPEN_TYPE",
                        "BMM_CONTAINER_TYPE",
                        "BMM_INDEXED_CONTAINER_TYPE",
                        "BMM_GENERIC_TYPE",
                        "BMM_GENERIC_PARAMETER",
                        "BMM_PROPERTY",
                        "BMM_CONTAINER_PROPERTY",
                        "BMM_PACKAGE_CONTAINER",
                        "BMM_PACKAGE",
                        "BMM_MODEL",
                        "BMM_SCHEMA_CORE",
                        "BMM_INCLUDE_SPEC"
                    ]
                },
                "rm_access": {
                    "name": "rm_access",
                    "classes": [
                        "REFERENCE_MODEL_ACCESS",
                        "SCHEMA_DESCRIPTOR"
                    ]
                }
            }
        },
        "org.openehr.lang.bmm_persistence": {
            "name": "org.openehr.lang.bmm_persistence",
            "classes": [
                "P_BMM_CLASS",
                "P_BMM_INTERFACE",
                "P_BMM_ENUMERATION",
                "P_BMM_SCHEMA",
                "P_BMM_PROPERTY",
                "P_BMM_GENERIC_PARAMETER",
                "P_BMM_TYPE",
                "P_BMM_CONTAINER_TYPE",
                "P_BMM_SIMPLE_TYPE",
                "P_BMM_OPEN_TYPE",
                "P_BMM_GENERIC_TYPE",
                "P_BMM_PACKAGE",
                "P_BMM_PACKAGE_CONTAINER",
                "P_BMM_CONTAINER_PROPERTY",
                "P_BMM_SINGLE_PROPERTY",
                "P_BMM_SINGLE_PROPERTY_OPEN",
                "P_BMM_GENERIC_PROPERTY",
                "P_BMM_CONSTANT",
                "P_BMM_FUNCTION",
                "P_BMM_FUNCTION_PARAMETER",
                "P_BMM_SINGLE_FUNCTION_PARAMETER",
                "P_BMM_SINGLE_FUNCTION_PARAMETER_OPEN",
                "P_BMM_CONTAINER_FUNCTION_PARAMETER",
                "P_BMM_GENERIC_FUNCTION_PARAMETER",
                "P_BMM_ENUMERATION_INTEGER",
                "P_BMM_ENUMERATION_STRING",
                "P_BMM_MODEL_ELEMENT",
                "P_BMM_BASE_TYPE",
                "P_BMM_SCHEMA_DESCRIPTOR",
                "P_BMM_INDEXED_CONTAINER_PROPERTY",
                "P_BMM_INDEXED_CONTAINER_TYPE"
            ]
        },
        "org.openehr.lang.beom": {
            "name": "org.openehr.lang.beom",
            "packages": {
                "core": {
                    "name": "core",
                    "classes": [
                        "ASSERTION",
                        "ASSIGNMENT",
                        "EXPR_BINARY_OPERATOR",
                        "EXPR_FUNCTION_CALL",
                        "EXPRESSION",
                        "EXPR_LEAF",
                        "EXPR_LITERAL",
                        "EXPR_OPERATOR",
                        "EXPR_UNARY_OPERATOR",
                        "EXPR_VARIABLE_REF",
                        "EXTERNAL_QUERY",
                        "EXPR_VALUE",
                        "STATEMENT_SET",
                        "STATEMENT",
                        "VARIABLE_DECLARATION",
                        "EXPR_VALUE_REF",
                        "EXPR_FOR_ALL",
                        "OPERATOR_KIND"
                    ]
                },
                "types": {
                    "name": "types",
                    "classes": [
                        "EXPR_TYPE_DEF",
                        "TYPE_DEF_BOOLEAN",
                        "TYPE_DEF_DATE",
                        "TYPE_DEF_DATE_TIME",
                        "TYPE_DEF_DURATION",
                        "TYPE_DEF_INTEGER",
                        "TYPE_DEF_OBJECT_REF",
                        "TYPE_DEF_REAL",
                        "TYPE_DEF_STRING",
                        "TYPE_DEF_TERMINOLOGY_CODE",
                        "TYPE_DEF_TIME",
                        "TYPE_DEF_URI"
                    ]
                }
            }
        }
    },
    "class_definitions": {
        "BMM_DEFINITIONS": {
            "name": "BMM_DEFINITIONS",
            "documentation": "Definitions used by all BMM packages.",
            "constants": {
                "Bmm_internal_version": {
                    "name": "Bmm_internal_version",
                    "documentation": "Current internal version of BMM meta-model, used to determine if a given schema can be processed by a given implementation of the model.",
                    "type": "String"
                },
                "Schema_name_delimiter": {
                    "name": "Schema_name_delimiter",
                    "documentation": "Delimiter used to separate schema id from package path in a fully qualified path.",
                    "type": "String",
                    "value": "\"::\""
                },
                "Package_name_delimiter": {
                    "name": "Package_name_delimiter",
                    "documentation": "Delimiter used to separate package names in a package path.",
                    "type": "String",
                    "value": "\".\""
                },
                "Bmm_schema_file_extension": {
                    "name": "Bmm_schema_file_extension",
                    "documentation": "Extension used for BMM files.",
                    "type": "String",
                    "value": "\".bmm\""
                }
            }
        },
        "BMM_INCLUDE_SPEC": {
            "name": "BMM_INCLUDE_SPEC",
            "documentation": "Schema inclusion structure.",
            "properties": {
                "id": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "id",
                    "documentation": "Full identifier of the included schema, e.g. \"openehr_primitive_types_1.0.2\".",
                    "is_mandatory": true,
                    "type": "String"
                }
            }
        },
        "BMM_MODEL_ELEMENT": {
            "name": "BMM_MODEL_ELEMENT",
            "documentation": "Ancestor class of most BMM model elements.",
            "is_abstract": true,
            "ancestors": [
                "BMM_DEFINITIONS"
            ],
            "properties": {
                "documentation": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "documentation",
                    "documentation": "Optional documentation of this element.",
                    "type": "String"
                }
            }
        },
        "BMM_CONTAINER_PROPERTY": {
            "name": "BMM_CONTAINER_PROPERTY",
            "documentation": "Subtype of BMM_PROPERTY that represents a container type based on one of the inbuilt types List <>, Set <>, Array <>.",
            "ancestors": [
                "BMM_PROPERTY"
            ],
            "properties": {
                "cardinality": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "cardinality",
                    "documentation": "Cardinality of this container.",
                    "type": "Multiplicity_interval"
                },
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Redefined to BMM_CONTAINER_TYPE.",
                    "is_mandatory": true,
                    "type": "BMM_CONTAINER_TYPE"
                }
            },
            "functions": {
                "display_name": {
                    "name": "display_name",
                    "documentation": "Name of this attribute to display in UI.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_PROPERTY": {
            "name": "BMM_PROPERTY",
            "documentation": "Model of a property definition within a class definition of an object model. Generic parameter takes care of variants.",
            "ancestors": [
                "BMM_MODEL_ELEMENT"
            ],
            "generic_parameter_defs": {
                "T": {
                    "name": "T",
                    "conforms_to_type": "BMM_TYPE"
                }
            },
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this property in the model.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "is_mandatory": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_mandatory",
                    "documentation": "True if this property is mandatory in its class.",
                    "type": "Boolean"
                },
                "is_computed": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_computed",
                    "documentation": "True if this property is computed rather than stored in objects of this class.",
                    "type": "Boolean"
                },
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY_OPEN",
                    "name": "type",
                    "documentation": "Formal type of this property.",
                    "is_mandatory": true,
                    "type": "T"
                },
                "is_im_runtime": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_im_runtime",
                    "documentation": "True if this property is marked with info model `_im_runtime_` property.",
                    "type": "Boolean",
                    "default": false
                },
                "is_im_infrastructure": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_im_infrastructure",
                    "documentation": "True if this property was marked with info model `_im_infrastructure_` flag.",
                    "type": "Boolean",
                    "default": false
                }
            },
            "functions": {
                "existence": {
                    "name": "existence",
                    "documentation": "Interval form of `0..1`, `1..1` etc, generated from `_is_mandatory_`.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Multiplicity_interval"
                    }
                },
                "display_name": {
                    "name": "display_name",
                    "documentation": "Name of this attribute to display in UI.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_MODEL": {
            "name": "BMM_MODEL",
            "documentation": "Model of a BMM schema (along with what is inherited from BMM_SCHEMA_CORE).",
            "ancestors": [
                "BMM_SCHEMA_CORE",
                "BMM_PACKAGE_CONTAINER"
            ],
            "properties": {
                "class_definitions": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "class_definitions",
                    "documentation": "All classes in this schema.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_CLASS"
                        ]
                    }
                }
            },
            "functions": {
                "primitive_types": {
                    "name": "primitive_types",
                    "documentation": "List of keys in `class_definitions' of items marked as primitive types, as defined in input schema.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "enumeration_types": {
                    "name": "enumeration_types",
                    "documentation": "List of keys in `class_definitions' of items that are enumeration types, as defined in input schema.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "class_definition": {
                    "name": "class_definition",
                    "documentation": "Retrieve the class definition corresponding to `a_type_name' (which may contain a generic part).",
                    "parameters": {
                        "a_name": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_name",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_CLASS"
                    }
                },
                "enumeration_definition": {
                    "name": "enumeration_definition",
                    "documentation": "Retrieve the enumeration definition corresponding to `a_type_name'.",
                    "parameters": {
                        "a_name": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_name",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_ENUMERATION"
                    }
                },
                "property_definition": {
                    "name": "property_definition",
                    "documentation": "Retrieve the property definition for `a_prop_name' in flattened class corresponding to `a_type_name'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_PROPERTY"
                    }
                },
                "ms_conformant_property_type": {
                    "name": "ms_conformant_property_type",
                    "documentation": "True if `a_ms_property_type' is a valid 'MS' dynamic type for `a_property' in BMM type `a_bmm_type_name'. 'MS' conformance means 'model-semantic' conformance, which abstracts away container types like List<>, Set<> etc and compares the dynamic type with the relation target type in the UML sense, i.e. regardless of whether there is single or multiple containment.",
                    "parameters": {
                        "a_bmm_type_name": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_bmm_type_name",
                            "type": "String"
                        },
                        "a_bmm_property_name": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_bmm_property_name",
                            "type": "String"
                        },
                        "a_ms_property_name": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_ms_property_name",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                },
                "property_definition_at_path": {
                    "name": "property_definition_at_path",
                    "documentation": "Retrieve the property definition for `a_property_path' in flattened class corresponding to `a_type_name'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_PROPERTY"
                    }
                },
                "all_ancestor_classes": {
                    "name": "all_ancestor_classes",
                    "documentation": "Return all ancestor types of `a_class_name' up to root class (usually 'ANY', 'Object' or something similar). Does not include current class. Returns empty list if none.",
                    "parameters": {
                        "a_class": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_class",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "type_conforms_to": {
                    "name": "type_conforms_to",
                    "documentation": "Check conformance of `a_desc_type' to `an_anc_type'; the types may be generic, and may contain open generic parameters like 'T' etc. These are replaced with their appropriate constrainer types, or Any during the conformance testing process.",
                    "parameters": {
                        "a_desc_type": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_desc_type",
                            "type": "String"
                        },
                        "an_anc_type": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "an_anc_type",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                }
            }
        },
        "BMM_PACKAGE": {
            "name": "BMM_PACKAGE",
            "documentation": "Abstraction of a package as a tree structure whose nodes can contain other packages and classes.",
            "ancestors": [
                "BMM_PACKAGE_CONTAINER"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this package. This name may be qualified if it is a top-level package.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "classes": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "classes",
                    "documentation": "Classes listed as being in this package.",
                    "type_def": {
                        "container_type": "List",
                        "type": "BMM_CLASS"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                }
            },
            "functions": {
                "root_classes": {
                    "name": "root_classes",
                    "documentation": "Obtain the set of top-level classes in this package, either from this package itself or by recursing into the structure until classes are obtained from child packages. Recurse into each child only far enough to find the first level of classes.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "BMM_CLASS"
                    },
                    "is_nullable": true
                },
                "path": {
                    "name": "path",
                    "documentation": "Full path of this package back to root package.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_PACKAGE_CONTAINER": {
            "name": "BMM_PACKAGE_CONTAINER",
            "documentation": "Abstraction of a BMM model component that contains packages and classes.",
            "ancestors": [
                "BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "packages": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "packages",
                    "documentation": "Child packages; keys all in upper case for guaranteed matching.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_PACKAGE"
                        ]
                    }
                }
            },
            "functions": {
                "package_at_path": {
                    "name": "package_at_path",
                    "documentation": "Package at the path `a_path'.",
                    "parameters": {
                        "a_path": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_path",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_PACKAGE"
                    }
                },
                "do_recursive_packages": {
                    "name": "do_recursive_packages",
                    "documentation": "Recursively execute `action', which is a procedure taking a BMM_PACKAGE argument, on all members of packages.",
                    "parameters": {
                        "action": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "action",
                            "type": "PROCEDURE"
                        }
                    }
                },
                "has_package_path": {
                    "name": "has_package_path",
                    "documentation": "True if there is a package at the path `a_path'; paths are delimited with Package_name_delimiter.",
                    "parameters": {
                        "a_path": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_path",
                            "type": "String"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                }
            }
        },
        "P_BMM_CLASS": {
            "name": "P_BMM_CLASS",
            "documentation": "Definition of persistent form of `BMM_CLASS` for serialisation to ODIN, JSON, XML etc.",
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of the class. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "ancestors": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "ancestors",
                    "documentation": "List of immediate inheritance parents. If there are generic ancestors, use `_ancestor_defs_` instead. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "constants": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "constants",
                    "documentation": "Constants defined in this class, keyed by name. Persistent attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_CONSTANT"
                        ]
                    }
                },
                "properties": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "properties",
                    "documentation": "List of attributes defined in this class. Persistent attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_PROPERTY"
                        ]
                    }
                },
                "functions": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "functions",
                    "documentation": "List of functions (routines) defined in this class, keyed by name. Persistent attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_FUNCTION"
                        ]
                    }
                },
                "invariants": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "invariants",
                    "documentation": "Invariants defined on this class, as a Hash of assertion expressions keyed by tag. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "String"
                        ]
                    }
                },
                "is_abstract": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_abstract",
                    "documentation": "True if this is an abstract type. Persisted attribute.",
                    "type": "Boolean"
                },
                "is_override": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_override",
                    "documentation": "True if this class definition overrides one found in an included schema.",
                    "type": "Boolean"
                },
                "generic_parameter_defs": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "generic_parameter_defs",
                    "documentation": "List of generic parameter definitions. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_GENERIC_PARAMETER"
                        ]
                    }
                },
                "source_schema_id": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "source_schema_id",
                    "documentation": "Reference to original source schema defining this class. Set during `BMM_SCHEMA` materialise. Useful for GUI tools to enable user to edit the schema file containing a given class (i.e. taking into account that a class may be in any of the schemas in a schema inclusion hierarchy).",
                    "is_mandatory": true,
                    "type": "String"
                },
                "bmm_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_class",
                    "documentation": "`BMM_CLASS` object built by `_create_bmm_class_definition_` and `_populate_bmm_class_definition_`.",
                    "type": "BMM_CLASS"
                },
                "uid": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "uid",
                    "documentation": "Unique id generated for later comparison during merging, in order to detect if two classes are the same. Assigned in post-load processing.",
                    "is_mandatory": true,
                    "type": "Integer"
                },
                "ancestor_defs": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "ancestor_defs",
                    "documentation": "List of structured inheritance ancestors, used only in the case of generic inheritance. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "P_BMM_GENERIC_TYPE"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                }
            },
            "functions": {
                "is_generic": {
                    "name": "is_generic",
                    "documentation": "True if this class is a generic class.",
                    "post_conditions": {
                        "Post": "Result := generic_parameter_defs /= Void"
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                },
                "create_bmm_class": {
                    "name": "create_bmm_class",
                    "documentation": "Create `_bmm_class_definition_`.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "populate_bmm_class": {
                    "name": "populate_bmm_class",
                    "documentation": "Add remaining model elements from Current to `_bmm_class_definition_`.",
                    "parameters": {
                        "a_bmm_schema": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_bmm_schema",
                            "type": "BMM_MODEL"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            }
        },
        "P_BMM_INTERFACE": {
            "name": "P_BMM_INTERFACE",
            "documentation": "Persistent form of a BMM interface, i.e. a class-like definition consisting only of functions (no state). Used to capture pure operation interfaces.",
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this interface. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "functions": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "functions",
                    "documentation": "Functions (routines) declared by this interface, keyed by name. Persistent attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_FUNCTION"
                        ]
                    }
                }
            }
        },
        "P_BMM_ENUMERATION": {
            "name": "P_BMM_ENUMERATION",
            "documentation": "Persistent form of `BMM_ENUMERATION` attributes.",
            "ancestors": [
                "P_BMM_CLASS"
            ],
            "properties": {
                "item_names": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "item_names",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "item_values": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "item_values",
                    "type_def": {
                        "container_type": "List",
                        "type": "Any"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "item_documentations": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "item_documentations",
                    "documentation": "Optional documentation strings for the enumeration items, in the same order as `_item_names_`. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "bmm_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_class",
                    "documentation": "`BMM_CLASS` object build by `_create_bmm_class_definition_` and `_populate_bmm_class_definition_`.",
                    "type": "BMM_ENUMERATION"
                }
            }
        },
        "P_BMM_SCHEMA": {
            "name": "P_BMM_SCHEMA",
            "documentation": "Persisted form of `BMM_SCHEMA`.",
            "ancestors": [
                "P_BMM_PACKAGE_CONTAINER",
                "BMM_SCHEMA_CORE"
            ],
            "properties": {
                "bmm_version": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_version",
                    "documentation": "Version of the BMM (P_BMM) meta-model to which this schema conforms, e.g. `2.4`. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "includes": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "includes",
                    "documentation": "Other schemas included by this schema, keyed by schema id. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_INCLUDE_SPEC"
                        ]
                    }
                },
                "primitive_types": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "primitive_types",
                    "documentation": "Primitive type definitions. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "P_BMM_CLASS"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "class_definitions": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "class_definitions",
                    "documentation": "Class definitions. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "P_BMM_CLASS"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                }
            },
            "functions": {
                "validate_created": {
                    "name": "validate_created",
                    "documentation": "Implementation of `_validate_created()_`",
                    "pre_conditions": {
                        "Pre_state": "state = State_created"
                    },
                    "post_conditions": {
                        "Post_state": "passed implies state = State_validated_created"
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "load_finalise": {
                    "name": "load_finalise",
                    "documentation": "Implementation of `_load_finalise()_`",
                    "pre_conditions": {
                        "Pre_state": "state = State_validated_created"
                    },
                    "post_conditions": {
                        "Post_state": "state = State_includes_processed or state = State_includes_pending"
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "merge": {
                    "name": "merge",
                    "documentation": "Implementation of `_merge()_`",
                    "parameters": {
                        "other": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "other",
                            "type": "P_BMM_SCHEMA"
                        }
                    },
                    "pre_conditions": {
                        "Pre_state": "state = State_includes_pending",
                        "Pre_other_valid": "includes_to_process.has (included_schema.schema_id)"
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "validate": {
                    "name": "validate",
                    "documentation": "Implementation of `_validate()_`",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "create_bmm_model": {
                    "name": "create_bmm_model",
                    "documentation": "Implementation of `_create_bmm_model()_`",
                    "pre_conditions": {
                        "Pre_state": "state = P_BMM_PACKAGE_STATE.State_includes_processed"
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "canonical_packages": {
                    "name": "canonical_packages",
                    "documentation": "Package structure in which all top-level qualified package names like `xx.yy.zz` have been expanded out to a hierarchy of `BMM_PACKAGE` objects.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "P_BMM_PACKAGE"
                    }
                }
            }
        },
        "P_BMM_PROPERTY": {
            "name": "P_BMM_PROPERTY",
            "documentation": "Persistent form of `BMM_PROPERTY`.",
            "is_abstract": true,
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this property within its class. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "is_mandatory": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_mandatory",
                    "documentation": "True if this property is mandatory in its class. Persisted attribute.",
                    "type": "Boolean"
                },
                "is_computed": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_computed",
                    "documentation": "True if this property is computed rather than stored in objects of this class. Persisted Attribute.",
                    "type": "Boolean"
                },
                "is_im_infrastructure": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_im_infrastructure",
                    "documentation": "True if this property is info model 'infrastructure' rather than 'data'. Persisted attribute.",
                    "type": "Boolean"
                },
                "is_im_runtime": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_im_runtime",
                    "documentation": "True if this property is info model 'runtime' settable property. Persisted attribute.",
                    "type": "Boolean"
                },
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of this property, if not a simple String type reference. Persisted attribute.",
                    "type": "P_BMM_TYPE"
                },
                "bmm_property": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_property",
                    "documentation": "BMM_PROPERTY created by create_bmm_property_definition.",
                    "type": "BMM_PROPERTY"
                }
            },
            "functions": {
                "create_bmm_property": {
                    "name": "create_bmm_property",
                    "documentation": "Create `_bmm_property_definition_` from `P_BMM_XX` parts.",
                    "parameters": {
                        "a_bmm_schema": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_bmm_schema",
                            "type": "BMM_MODEL"
                        },
                        "a_class_def": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_class_def",
                            "type": "BMM_CLASS"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            }
        },
        "P_BMM_GENERIC_PARAMETER": {
            "name": "P_BMM_GENERIC_PARAMETER",
            "documentation": "Persistent form of `BMM_GENERIC_PARAMETER`.",
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of the parameter, e.g. 'T' etc. Persisted attribute. Name is limited to 1 character, upper case.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "conforms_to_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "conforms_to_type",
                    "documentation": "Optional conformance constraint - the name of a type to which a concrete substitution of this generic parameter must conform. Persisted attribute.",
                    "type": "String"
                },
                "bmm_generic_parameter": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_generic_parameter",
                    "documentation": "`BMM_GENERIC_PARAMETER` created by `_create_bmm_generic_parameter_`.",
                    "type": "BMM_GENERIC_PARAMETER"
                }
            },
            "functions": {
                "create_bmm_generic_parameter": {
                    "name": "create_bmm_generic_parameter",
                    "documentation": "Create `_bmm_generic_parameter_`.",
                    "parameters": {
                        "a_bmm_schema": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_bmm_schema",
                            "type": "BMM_MODEL"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            },
            "invariants": {
                "Post_name": "name.count = 1 and name.is_upper"
            }
        },
        "P_BMM_TYPE": {
            "name": "P_BMM_TYPE",
            "documentation": "Persistent form of `BMM_TYPE`.",
            "is_abstract": true,
            "properties": {
                "bmm_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_type",
                    "documentation": "Result of `_create_bmm_type()_` call.",
                    "type": "BMM_TYPE"
                }
            },
            "functions": {
                "create_bmm_type": {
                    "name": "create_bmm_type",
                    "documentation": "Create appropriate `BMM_XXX` object; effected in descendants.",
                    "is_abstract": true,
                    "parameters": {
                        "a_schema": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_schema",
                            "type": "BMM_MODEL"
                        },
                        "a_class_def": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_class_def",
                            "type": "BMM_CLASS"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "as_type_string": {
                    "name": "as_type_string",
                    "documentation": "Formal name of the type for display.",
                    "is_abstract": true,
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "P_BMM_CONTAINER_TYPE": {
            "name": "P_BMM_CONTAINER_TYPE",
            "documentation": "Persistent form of `BMM_CONTAINER_TYPE`.",
            "ancestors": [
                "P_BMM_TYPE"
            ],
            "properties": {
                "container_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "container_type",
                    "documentation": "The type of the container. This converts to the `_root_type_` in `BMM_GENERIC_TYPE`. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of `_type_`, if not a simple String type reference. Persisted attribute.",
                    "type": "P_BMM_BASE_TYPE"
                },
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "The target type; this converts to the first parameter in `_generic_parameters_` in `BMM_GENERIC_TYPE`. Persisted attribute.",
                    "type": "String"
                },
                "bmm_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_type",
                    "documentation": "Result of `_create_bmm_type()_` call.",
                    "type": "BMM_CONTAINER_TYPE"
                }
            },
            "functions": {
                "type_ref": {
                    "name": "type_ref",
                    "documentation": "The target type; this converts to the first parameter in `_generic_parameters_` in `BMM_GENERIC_TYPE`. Persisted attribute.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "P_BMM_BASE_TYPE"
                    }
                }
            }
        },
        "P_BMM_SIMPLE_TYPE": {
            "name": "P_BMM_SIMPLE_TYPE",
            "documentation": "Persistent form of `BMM_SIMPLE_TYPE`.",
            "ancestors": [
                "P_BMM_BASE_TYPE"
            ],
            "properties": {
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Name of type - must be a simple class name.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "bmm_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_type",
                    "documentation": "Result of `_create_bmm_type()_` call.",
                    "type": "BMM_SIMPLE_TYPE"
                }
            }
        },
        "P_BMM_OPEN_TYPE": {
            "name": "P_BMM_OPEN_TYPE",
            "documentation": "Persistent form of `BMM_GENERIC_PARAMETER` or `BMM_PARAMETER_TYPE` (in BMM v3).",
            "ancestors": [
                "P_BMM_BASE_TYPE"
            ],
            "properties": {
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Simple type parameter as a single letter like 'T', 'G' etc.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "bmm_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_type",
                    "documentation": "Result of `_create_bmm_type()_` call.",
                    "type": "BMM_OPEN_TYPE"
                }
            }
        },
        "P_BMM_GENERIC_TYPE": {
            "name": "P_BMM_GENERIC_TYPE",
            "documentation": "Persistent form of `BMM_GENERIC_TYPE`.",
            "ancestors": [
                "P_BMM_BASE_TYPE"
            ],
            "properties": {
                "root_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "root_type",
                    "documentation": "Root type of this generic type, e.g. `Interval` in `Interval<Integer>`.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "generic_parameter_defs": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "generic_parameter_defs",
                    "documentation": "Generic parameters of the root_type in this type specifier if non-simple types. The order must match the order of the owning class's formal generic parameter declarations. Persistent attribute.",
                    "is_mandatory": true,
                    "type_def": {
                        "container_type": "List",
                        "type": "P_BMM_TYPE"
                    },
                    "cardinality": {
                        "lower": 1,
                        "upper_unbounded": true
                    }
                },
                "generic_parameters": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "generic_parameters",
                    "documentation": "Generic parameters of the `_root_type_` in this type specifier, if simple types. The order must match the order of the owning class's formal generic parameter declarations. Persistent attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "bmm_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_type",
                    "documentation": "Result of `_create_bmm_type()_` call.",
                    "type": "BMM_GENERIC_TYPE"
                }
            },
            "functions": {
                "generic_parameter_refs": {
                    "name": "generic_parameter_refs",
                    "documentation": "Generic parameters of the root_type in this type specifier. The order must match the order of the owning class's formal generic parameter declarations",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "P_BMM_TYPE"
                    },
                    "is_nullable": true
                }
            }
        },
        "P_BMM_PACKAGE": {
            "name": "P_BMM_PACKAGE",
            "documentation": "Persisted form of a package as a tree structure whose nodes can contain more packages and/or classes.",
            "ancestors": [
                "P_BMM_PACKAGE_CONTAINER",
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of the package from schema; this name may be qualified if it is a top-level package within the schema, or unqualified. Persistent attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "classes": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "classes",
                    "documentation": "List of classes in this package. Persistent attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "bmm_package_definition": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_package_definition",
                    "documentation": "`BMM_PACKAGE` created by `_create_bmm_package_definition_`.",
                    "type": "BMM_PACKAGE"
                }
            },
            "functions": {
                "merge": {
                    "name": "merge",
                    "documentation": "Merge packages and classes from other (from an included `P_BMM_SCHEMA`) into this package.",
                    "parameters": {
                        "other": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "other",
                            "type": "P_BMM_PACKAGE"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "create_bmm_package_definition": {
                    "name": "create_bmm_package_definition",
                    "documentation": "Generate a `BMM_PACKAGE_DEFINITION` object and write it to `_bmm_package_definition_`.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            }
        },
        "P_BMM_PACKAGE_CONTAINER": {
            "name": "P_BMM_PACKAGE_CONTAINER",
            "documentation": "Persisted form of a model component that contains packages.",
            "properties": {
                "packages": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "packages",
                    "documentation": "Package structure as a hierarchy of packages each potentially containing names of classes in that package in the original model.",
                    "is_mandatory": true,
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_PACKAGE"
                        ]
                    }
                }
            }
        },
        "P_BMM_CONTAINER_PROPERTY": {
            "name": "P_BMM_CONTAINER_PROPERTY",
            "documentation": "Persistent form of `BMM_CONTAINER_PROPERTY`.",
            "ancestors": [
                "P_BMM_PROPERTY"
            ],
            "properties": {
                "cardinality": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "cardinality",
                    "documentation": "Cardinality of this property in its class. Persistent attribute.",
                    "type_def": {
                        "root_type": "Interval",
                        "generic_parameters": [
                            "Integer"
                        ]
                    }
                },
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of this property, if not a simple String type reference. Persistent attribute.",
                    "type": "P_BMM_CONTAINER_TYPE"
                },
                "bmm_property": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_property",
                    "documentation": "`BMM_PROPERTY` created by `_create_bmm_property_`.",
                    "type": "BMM_CONTAINER_PROPERTY"
                }
            },
            "functions": {
                "create_bmm_property": {
                    "name": "create_bmm_property",
                    "documentation": "Create `_bmm_property_definition_`.",
                    "parameters": {
                        "a_bmm_schema": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_bmm_schema",
                            "type": "BMM_MODEL"
                        },
                        "a_class_def": {
                            "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                            "name": "a_class_def",
                            "type": "BMM_CLASS"
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            }
        },
        "P_BMM_SINGLE_PROPERTY": {
            "name": "P_BMM_SINGLE_PROPERTY",
            "documentation": "Persistent form of `BMM_SINGLE_PROPERTY`.",
            "ancestors": [
                "P_BMM_PROPERTY"
            ],
            "properties": {
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "If the type is a simple type, then this attribute will hold the type name. If the type is a container or generic, then type_ref will hold the type definition. The resulting type is generated in type_def.",
                    "type": "String"
                },
                "type_ref": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_ref",
                    "documentation": "Type definition of this property computed from `_type_` for later use in `_bmm_property_`.",
                    "type": "P_BMM_SIMPLE_TYPE"
                },
                "bmm_property": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_property",
                    "documentation": "`BMM_PROPERTY` created by `_create_bmm_property_definition_`.",
                    "type": "BMM_PROPERTY"
                }
            },
            "functions": {
                "type_def": {
                    "name": "type_def",
                    "documentation": "Generate `_type_ref_` from `_type_` and save.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "P_BMM_SIMPLE_TYPE"
                    }
                }
            }
        },
        "P_BMM_SINGLE_PROPERTY_OPEN": {
            "name": "P_BMM_SINGLE_PROPERTY_OPEN",
            "documentation": "Persistent form of a `BMM_SINGLE_PROPERTY_OPEN`.",
            "ancestors": [
                "P_BMM_PROPERTY"
            ],
            "properties": {
                "type_ref": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_ref",
                    "documentation": "Type definition of this property computed from `_type_` for later use in `_bmm_property_`.",
                    "type": "P_BMM_OPEN_TYPE"
                },
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Type definition of this property, if a simple String type reference. Really we should use `_type_def_` to be regular in the schema, but that makes the schema more wordy and less clear. So we use this persisted String value, and compute the `_type_def_` on the fly. Persisted attribute.",
                    "type": "String"
                },
                "bmm_property": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_property",
                    "documentation": "`BMM_PROPERTY` created by `_create_bmm_property_definition_`.",
                    "type": "BMM_PROPERTY"
                }
            },
            "functions": {
                "type_def": {
                    "name": "type_def",
                    "documentation": "Generate `_type_ref_` from `_type_` and save.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "P_BMM_OPEN_TYPE"
                    }
                }
            }
        },
        "P_BMM_GENERIC_PROPERTY": {
            "name": "P_BMM_GENERIC_PROPERTY",
            "documentation": "Persistent form of `BMM_GENERIC_PROPERTY`.",
            "ancestors": [
                "P_BMM_PROPERTY"
            ],
            "properties": {
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of this property, if not a simple String type reference. Persistent attribute.",
                    "type": "P_BMM_GENERIC_TYPE"
                },
                "bmm_property": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_property",
                    "documentation": "`BMM_PROPERTY` created by `_create_bmm_property_definition_`.",
                    "type": "BMM_PROPERTY"
                }
            }
        },
        "P_BMM_CONSTANT": {
            "name": "P_BMM_CONSTANT",
            "documentation": "Persistent form of a BMM constant, i.e. a named, typed literal value defined on a class.",
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this constant within its class. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Type name of this constant, as a simple class name. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "value": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "value",
                    "documentation": "The literal value of this constant, in its persisted (serialised) form. Persisted attribute.",
                    "type": "String"
                }
            }
        },
        "P_BMM_FUNCTION": {
            "name": "P_BMM_FUNCTION",
            "documentation": "Persistent form of a BMM function (routine) definition within a class definition.",
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this function within its class. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "aliases": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "aliases",
                    "documentation": "Optional alias names for this function, keyed by alias. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "String"
                        ]
                    }
                },
                "is_abstract": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_abstract",
                    "documentation": "True if this function is abstract in its class, i.e. has no implementation. Persisted attribute.",
                    "type": "Boolean"
                },
                "parameters": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "parameters",
                    "documentation": "Formal parameters of the function, keyed by parameter name. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "P_BMM_FUNCTION_PARAMETER"
                        ]
                    }
                },
                "pre_conditions": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "pre_conditions",
                    "documentation": "Optional pre-condition assertions on this function, keyed by tag. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "String"
                        ]
                    }
                },
                "post_conditions": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "post_conditions",
                    "documentation": "Optional post-condition assertions on this function, keyed by tag. Persisted attribute.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "String"
                        ]
                    }
                },
                "result": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "result",
                    "documentation": "Type definition of the function result, if any (absent for procedures). Persisted attribute.",
                    "type": "P_BMM_TYPE"
                },
                "is_nullable": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_nullable",
                    "documentation": "True if the result of this function is allowed to be Void (null). Persisted attribute.",
                    "type": "Boolean"
                }
            }
        },
        "P_BMM_FUNCTION_PARAMETER": {
            "name": "P_BMM_FUNCTION_PARAMETER",
            "documentation": "Persistent form of a BMM function (routine) parameter; abstract parent of the concrete persisted parameter kinds.",
            "is_abstract": true,
            "ancestors": [
                "P_BMM_MODEL_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this parameter within its function signature. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "is_nullable": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_nullable",
                    "documentation": "True if this parameter is allowed to be Void (null) in a call. Persisted attribute.",
                    "type": "Boolean"
                }
            }
        },
        "P_BMM_SINGLE_FUNCTION_PARAMETER": {
            "name": "P_BMM_SINGLE_FUNCTION_PARAMETER",
            "documentation": "Persistent form of a single-valued function parameter, i.e. one whose type is a simple class reference.",
            "ancestors": [
                "P_BMM_FUNCTION_PARAMETER"
            ],
            "properties": {
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Type name of this parameter, as a simple class name. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                }
            }
        },
        "P_BMM_SINGLE_FUNCTION_PARAMETER_OPEN": {
            "name": "P_BMM_SINGLE_FUNCTION_PARAMETER_OPEN",
            "documentation": "Persistent form of a single-valued function parameter whose type is an open generic parameter, e.g. `T`.",
            "ancestors": [
                "P_BMM_FUNCTION_PARAMETER"
            ],
            "properties": {
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Open type parameter, i.e. a generic parameter name such as `T`, `G` etc. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                }
            }
        },
        "P_BMM_CONTAINER_FUNCTION_PARAMETER": {
            "name": "P_BMM_CONTAINER_FUNCTION_PARAMETER",
            "documentation": "Persistent form of a function parameter whose type is a container type such as `List<T>`.",
            "ancestors": [
                "P_BMM_FUNCTION_PARAMETER"
            ],
            "properties": {
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of this parameter. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "P_BMM_CONTAINER_TYPE"
                },
                "cardinality": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "cardinality",
                    "documentation": "Cardinality of this parameter, if a container type. Persisted attribute.",
                    "type_def": {
                        "root_type": "Interval",
                        "generic_parameters": [
                            "Integer"
                        ]
                    }
                }
            }
        },
        "P_BMM_GENERIC_FUNCTION_PARAMETER": {
            "name": "P_BMM_GENERIC_FUNCTION_PARAMETER",
            "documentation": "Persistent form of a function parameter whose type is a generic type such as `Interval<Time>`.",
            "ancestors": [
                "P_BMM_FUNCTION_PARAMETER"
            ],
            "properties": {
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of this parameter. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "P_BMM_GENERIC_TYPE"
                }
            }
        },
        "P_BMM_ENUMERATION_INTEGER": {
            "name": "P_BMM_ENUMERATION_INTEGER",
            "documentation": "Persistent form of an instance of `BMM_ENUMERATION_INTEGER`.",
            "ancestors": [
                "P_BMM_ENUMERATION"
            ],
            "properties": {
                "bmm_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_class",
                    "documentation": "`BMM_CLASS` object build by `_create_bmm_class_definition_` and `_populate_bmm_class_definition_`.",
                    "type": "BMM_ENUMERATION_INTEGER"
                }
            }
        },
        "P_BMM_ENUMERATION_STRING": {
            "name": "P_BMM_ENUMERATION_STRING",
            "documentation": "Persistent form of `BMM_ENUMERATION_STRING`.",
            "ancestors": [
                "P_BMM_ENUMERATION"
            ],
            "properties": {
                "bmm_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_class",
                    "documentation": "`BMM_CLASS` object build by `_create_bmm_class_definition_` and `_populate_bmm_class_definition_`.",
                    "type": "BMM_ENUMERATION_STRING"
                }
            }
        },
        "P_BMM_MODEL_ELEMENT": {
            "name": "P_BMM_MODEL_ELEMENT",
            "documentation": "Persistent form of `BMM_MODEL_ELEMENT`.",
            "is_abstract": true,
            "properties": {
                "documentation": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "documentation",
                    "documentation": "Optional documentation of this element.",
                    "type": "String"
                }
            }
        },
        "P_BMM_BASE_TYPE": {
            "name": "P_BMM_BASE_TYPE",
            "documentation": "Persistent form of a proper (non-container) BMM type.",
            "is_abstract": true,
            "ancestors": [
                "P_BMM_TYPE"
            ],
            "properties": {
                "value_constraint": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "value_constraint",
                    "type": "String"
                }
            }
        },
        "P_BMM_SCHEMA_DESCRIPTOR": {
            "name": "P_BMM_SCHEMA_DESCRIPTOR",
            "documentation": "Concrete descendant of `BMM_SCHEMA_DESCRIPTOR` that provides a way to read an ODIN or other similarly encoded P_BMM schema file.",
            "ancestors": [
                "SCHEMA_DESCRIPTOR"
            ],
            "properties": {
                "bmm_schema": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_schema",
                    "documentation": "Persistent form of model.",
                    "type": "P_BMM_SCHEMA"
                }
            }
        },
        "P_BMM_INDEXED_CONTAINER_PROPERTY": {
            "name": "P_BMM_INDEXED_CONTAINER_PROPERTY",
            "ancestors": [
                "P_BMM_CONTAINER_PROPERTY"
            ],
            "properties": {
                "type_def": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_def",
                    "documentation": "Type definition of this property, if not a simple String type reference. Persistent attribute.",
                    "type": "P_BMM_INDEXED_CONTAINER_TYPE"
                },
                "bmm_property": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_property",
                    "documentation": "`BMM_PROPERTY` created by `_create_bmm_property_`.",
                    "type": "BMM_CONTAINER_PROPERTY"
                }
            }
        },
        "P_BMM_INDEXED_CONTAINER_TYPE": {
            "name": "P_BMM_INDEXED_CONTAINER_TYPE",
            "ancestors": [
                "P_BMM_CONTAINER_TYPE"
            ],
            "properties": {
                "index_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "index_type",
                    "is_mandatory": true,
                    "type": "String"
                },
                "bmm_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "bmm_type",
                    "documentation": "Result of `_create_bmm_type()_` call.",
                    "type": "BMM_INDEXED_CONTAINER_TYPE"
                }
            }
        },
        "ASSERTION": {
            "name": "ASSERTION",
            "documentation": "Meta-type for a first order predicate logic expression with a Boolean result. ",
            "ancestors": [
                "STATEMENT"
            ],
            "properties": {
                "tag": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "tag",
                    "documentation": "Expression tag, used for differentiating multiple assertions.",
                    "type": "String"
                },
                "string_expression": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "string_expression",
                    "documentation": "String form of expression, in case an expression evaluator taking String expressions is used for evaluation. ",
                    "type": "String"
                },
                "expression": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "expression",
                    "documentation": "Root of expression tree.",
                    "is_mandatory": true,
                    "type": "EXPRESSION"
                }
            }
        },
        "ASSIGNMENT": {
            "name": "ASSIGNMENT",
            "documentation": "Meta-type representing the assignment statement, which associates a named variable with an expression, and produces no value.",
            "ancestors": [
                "STATEMENT"
            ],
            "properties": {
                "target": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "target",
                    "documentation": "The target variable on the notional left-hand side of this assignment.",
                    "is_mandatory": true,
                    "type": "VARIABLE_DECLARATION"
                },
                "source": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "source",
                    "documentation": "Source right hand side) of the assignment.",
                    "is_mandatory": true,
                    "type": "EXPR_VALUE"
                }
            }
        },
        "EXPR_BINARY_OPERATOR": {
            "name": "EXPR_BINARY_OPERATOR",
            "documentation": "Binary operator expression node.",
            "ancestors": [
                "EXPR_OPERATOR"
            ],
            "properties": {
                "left_operand": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "left_operand",
                    "documentation": "Left operand node.",
                    "is_mandatory": true,
                    "type": "EXPRESSION"
                },
                "right_operand": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "right_operand",
                    "documentation": "Right operand node.",
                    "is_mandatory": true,
                    "type": "EXPRESSION"
                }
            }
        },
        "EXPR_FUNCTION_CALL": {
            "name": "EXPR_FUNCTION_CALL",
            "documentation": "Node representing a function call with 0 or more arguments.",
            "ancestors": [
                "EXPR_LEAF"
            ],
            "properties": {
                "arguments": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "arguments",
                    "documentation": "Arguments of this function, which can be from 0 to any number. Functions with no arguments are typically used to represent real world varying values like 'current time' and so on.",
                    "type_def": {
                        "container_type": "List",
                        "type": "EXPRESSION"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                }
            }
        },
        "EXPRESSION": {
            "name": "EXPRESSION",
            "documentation": "Abstract parent of all expression meta-types.",
            "is_abstract": true,
            "ancestors": [
                "EXPR_VALUE"
            ],
            "functions": {
                "type": {
                    "name": "type",
                    "documentation": "The primitive type of this node, which must be determined by redefinitions in concrete classes.",
                    "is_abstract": true,
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "EXPR_TYPE_DEF"
                    }
                }
            }
        },
        "EXPR_LEAF": {
            "name": "EXPR_LEAF",
            "documentation": "Meta-type representing one of:\n\n* a manifest constant of any primitive type;\n* a path referring to a value in the archetype;\n* a constraint;\n* a variable reference.\n",
            "is_abstract": true,
            "ancestors": [
                "EXPRESSION"
            ],
            "properties": {
                "item": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "item",
                    "documentation": "The reference item from which the value of this node can be computed.",
                    "type": "Any"
                }
            }
        },
        "EXPR_LITERAL": {
            "name": "EXPR_LITERAL",
            "documentation": "Literal value expression tree leaf item. This can represent a literal value of any primitive type included in the `PRIMITIVE_TYPE` enumeration.",
            "ancestors": [
                "EXPR_LEAF"
            ],
            "properties": {
                "item": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "item",
                    "documentation": "A statically set constant value of a primitive type.",
                    "is_mandatory": true,
                    "type": "Any"
                }
            }
        },
        "EXPR_OPERATOR": {
            "name": "EXPR_OPERATOR",
            "documentation": "Abstract parent of operator types.",
            "is_abstract": true,
            "ancestors": [
                "EXPRESSION"
            ],
            "properties": {
                "precedence_overridden": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "precedence_overridden",
                    "documentation": "True if the natural precedence of operators is overridden in the expression represented by this node of the expression tree. If True, parentheses should be introduced around the totality of the syntax expression corresponding to this operator node and its operands.",
                    "type": "Boolean"
                },
                "operator": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "operator",
                    "documentation": "Operator definition.",
                    "is_mandatory": true,
                    "type": "OPERATOR_KIND"
                },
                "symbol": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "symbol",
                    "documentation": "The symbol actually used in the rule, or intended to be used for serialisation. Must be a member of `operator_def.symbols`.",
                    "type": "String"
                }
            },
            "invariants": {
                "Symbol_validity": "symbol /= Void implies operator_def.symbols.has (symbol)"
            }
        },
        "EXPR_UNARY_OPERATOR": {
            "name": "EXPR_UNARY_OPERATOR",
            "documentation": "Unary operator expression node.",
            "ancestors": [
                "EXPR_OPERATOR"
            ],
            "properties": {
                "operand": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "operand",
                    "documentation": "Operand node.",
                    "is_mandatory": true,
                    "type": "EXPRESSION"
                }
            }
        },
        "EXPR_VARIABLE_REF": {
            "name": "EXPR_VARIABLE_REF",
            "documentation": "Expression tree leaf item representing a reference to a declared variable.",
            "ancestors": [
                "EXPR_LEAF"
            ],
            "properties": {
                "item": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "item",
                    "documentation": "The variable referred to.",
                    "is_mandatory": true,
                    "type": "VARIABLE_DECLARATION"
                }
            }
        },
        "EXTERNAL_QUERY": {
            "name": "EXTERNAL_QUERY",
            "documentation": "Definition of a variable whose value is derived from a query run on a data context in the operational environment. Typical uses of this kind of variable are to obtain values like the patient date of birth, sex, weight, and so on. It could also be used to obtain items from a knowledge context, such as a drug database.",
            "ancestors": [
                "EXPR_VALUE"
            ],
            "properties": {
                "context": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "context",
                    "documentation": "Optional name of context. This allows a basic separation of query types to be done in more sophisticated environments. Possible values might be \u201cpatient\u201d, \u201cmedications\u201d and so on.\nNot yet standardised.\n",
                    "is_mandatory": true,
                    "type": "String"
                },
                "query_id": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "query_id",
                    "documentation": "Identifier of query in the external context, e.g. \u201cdate_of_birth\u201d.\nNot yet standardised.\n",
                    "is_mandatory": true,
                    "type": "String"
                },
                "query_args": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "query_args",
                    "documentation": "Optional arguments to query.\nNot yet standardised.\n",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                }
            }
        },
        "EXPR_VALUE": {
            "name": "EXPR_VALUE",
            "documentation": "Any kind of statement element that can be evaluated. The type will either be supplied in descendant types or else will be inferred by an assignment statement linked to a typed variable.",
            "is_abstract": true,
            "functions": {
                "value": {
                    "name": "value",
                    "documentation": "The computed value of this node as a result of the nodes below it, for operator nodes, or else statically set or otherwise derived values.",
                    "is_abstract": true,
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Any"
                    }
                }
            }
        },
        "STATEMENT_SET": {
            "name": "STATEMENT_SET",
            "documentation": "A container for a specific set of statements intended to be used together.",
            "properties": {
                "statement": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "statement",
                    "documentation": "The member statements of this statement set.",
                    "type_def": {
                        "container_type": "List",
                        "type": "STATEMENT"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Optional name of this rule set.",
                    "type": "String"
                }
            },
            "functions": {
                "execution_result": {
                    "name": "execution_result",
                    "documentation": "Execution result of the whole rule set. Determined by the and-ing of result values of Assertions in the rule set.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                }
            }
        },
        "STATEMENT": {
            "name": "STATEMENT",
            "documentation": "Meta-type for the notion of statement, which is a non-value-returning entity.",
            "is_abstract": true
        },
        "VARIABLE_DECLARATION": {
            "name": "VARIABLE_DECLARATION",
            "documentation": "Meta-type for the declaration of a named variable that can be used in an expression.",
            "ancestors": [
                "STATEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of the variable.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type",
                    "documentation": "Primitive type of the variable, enabling its use to be type-checked in expressions.",
                    "is_mandatory": true,
                    "type": "EXPR_TYPE_DEF"
                }
            }
        },
        "EXPR_VALUE_REF": {
            "name": "EXPR_VALUE_REF",
            "documentation": "Path-based reference to a value in a data structure.",
            "ancestors": [
                "EXPR_LEAF"
            ]
        },
        "EXPR_FOR_ALL": {
            "name": "EXPR_FOR_ALL",
            "documentation": "Universal quantification operator, usually known as `for_all`, whose operand is a collection of items referenced by an `EXPR_VALUE_REF`. The `_condition_` attribute represents an assertion that is applied to every member of the collection at runtime to determine the result.",
            "ancestors": [
                "EXPR_OPERATOR"
            ],
            "properties": {
                "condition": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "condition",
                    "documentation": "Boolean condition that returns True or False when applied to a member of the operand of a `for_all` operator.",
                    "is_mandatory": true,
                    "type": "ASSERTION"
                },
                "operand": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "operand",
                    "documentation": "Reference to collection / container object to which the `for_all` operator is to be applied.",
                    "is_mandatory": true,
                    "type": "EXPR_VALUE_REF"
                }
            }
        },
        "OPERATOR_KIND": {
            "_type": "P_BMM_ENUMERATION_STRING",
            "name": "OPERATOR_KIND",
            "documentation": "Enumeration representing operators.",
            "ancestors": [
                "String"
            ],
            "item_names": [
                "eq",
                "ne",
                "lt",
                "le",
                "gt",
                "ge",
                "matches",
                "not",
                "and",
                "or",
                "xor",
                "implies",
                "for_all",
                "exists",
                "plus",
                "minus",
                "multiply",
                "divide",
                "modulo",
                "exponent"
            ],
            "item_documentations": [
                "Equality (equals) operator.",
                "Inequality (not-equals) operator.",
                "Less than operator.",
                "Less than or equals operator.",
                "Greater than operator.",
                "Greater than or equals operator.",
                "Matches operator.",
                "Logical negation (not) operator.",
                "Logical conjunction (and) operator.",
                "Logical inclusive disjunction (or) operator.",
                "Logical exclusive disjunction (exclusive or) operator.",
                "Logical implication (implies)  operator.",
                "Universal quantification operator.",
                "Existential quantification operator.",
                "Arithemetic addition (plus) operator.",
                "Arithemetic subtraction (minus) operator.",
                "Arithemetic multiplication (times) operator.",
                "Arithemetic division (divided-by) operator.",
                "Arithemetic modulo operator.",
                "Arithemetic exponent (to the power of) operator."
            ]
        },
        "EXPR_TYPE_DEF": {
            "name": "EXPR_TYPE_DEF",
            "documentation": "Ancestor class for type definitions known in the openEHR Expression formalism.",
            "is_abstract": true,
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "documentation": "Natural language type name of this type as used in abstract rules syntax variable declarations.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "documentation": "Attribute of the openEHR primitive type (or Any) corresponding to this type definition meta-type.",
                    "is_mandatory": true,
                    "type": "Any"
                }
            }
        },
        "TYPE_DEF_BOOLEAN": {
            "name": "TYPE_DEF_BOOLEAN",
            "documentation": "Rules meta-type representing the primitive type Boolean.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Boolean\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Boolean"
                }
            }
        },
        "TYPE_DEF_DATE": {
            "name": "TYPE_DEF_DATE",
            "documentation": "Rules meta-type representing the primitive type Date.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Date\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Iso8601_date"
                }
            }
        },
        "TYPE_DEF_DATE_TIME": {
            "name": "TYPE_DEF_DATE_TIME",
            "documentation": "Rules meta-type representing the primitive type Date_time.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Date_time\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Iso8601_date_time"
                }
            }
        },
        "TYPE_DEF_DURATION": {
            "name": "TYPE_DEF_DURATION",
            "documentation": "Rules meta-type representing the primitive type Duration.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Duration\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Iso8601_duration"
                }
            }
        },
        "TYPE_DEF_INTEGER": {
            "name": "TYPE_DEF_INTEGER",
            "documentation": "Rules meta-type representing the primitive type Integer.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Integer\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Integer"
                }
            }
        },
        "TYPE_DEF_OBJECT_REF": {
            "name": "TYPE_DEF_OBJECT_REF",
            "documentation": "Rules meta-type representing the type Object_ref, which is assumed to by the type of any non-primitive reference target within a rule.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Object_ref\"",
                    "type": "String"
                }
            }
        },
        "TYPE_DEF_REAL": {
            "name": "TYPE_DEF_REAL",
            "documentation": "Rules meta-type representing the primitive type Real.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Real\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Real"
                }
            }
        },
        "TYPE_DEF_STRING": {
            "name": "TYPE_DEF_STRING",
            "documentation": "Rules meta-type representing the primitive type String.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"String\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "String"
                }
            }
        },
        "TYPE_DEF_TERMINOLOGY_CODE": {
            "name": "TYPE_DEF_TERMINOLOGY_CODE",
            "documentation": "Rules meta-type representing the primitive type Terminology_code.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Terminology_code\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Terminology_code"
                }
            }
        },
        "TYPE_DEF_TIME": {
            "name": "TYPE_DEF_TIME",
            "documentation": "Rules meta-type representing the primitive type Time.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Time\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Iso8601_time"
                }
            }
        },
        "TYPE_DEF_URI": {
            "name": "TYPE_DEF_URI",
            "documentation": "Rules meta-type representing the primitive type Uri.",
            "ancestors": [
                "EXPR_TYPE_DEF"
            ],
            "properties": {
                "type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_name",
                    "is_mandatory": true,
                    "default": "\"Uri\"",
                    "type": "String"
                },
                "type_anchor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "type_anchor",
                    "is_mandatory": true,
                    "type": "Uri"
                }
            }
        },
        "BMM_CLASSIFIER": {
            "name": "BMM_CLASSIFIER",
            "documentation": "Abstract idea of specifying a type either by definition or by reference.",
            "is_abstract": true,
            "ancestors": [
                "BMM_MODEL_ELEMENT"
            ],
            "functions": {
                "type_name": {
                    "name": "type_name",
                    "documentation": "Formal string form of the type as per UML.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "type_category": {
                    "name": "type_category",
                    "documentation": "Generate a type category of main target type from Type_category_xx values.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "type_signature": {
                    "name": "type_signature",
                    "documentation": "Signature form of the type, which for generics includes generic parameter constrainer types e.g. Interval<T:Ordered>.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "base_class": {
                    "name": "base_class",
                    "documentation": "Main design class for this type, from which properties etc can be extracted.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_CLASS"
                    }
                },
                "flattened_type_list": {
                    "name": "flattened_type_list",
                    "documentation": "Completely flattened list of type names, flattening out all generic parameters.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                }
            }
        },
        "BMM_CLASS": {
            "name": "BMM_CLASS",
            "documentation": "Definition of a class in an object model. A class is type that may be open or closed in terms of other types mentioned within.",
            "ancestors": [
                "BMM_CLASSIFIER"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of this class. Note that unlike UML, names of classes are just the root name, even if the class is generic.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "ancestors": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "ancestors",
                    "documentation": "List of immediate inheritance parents.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_CLASS"
                        ]
                    }
                },
                "package": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "package",
                    "documentation": "Package this class belongs to.",
                    "is_mandatory": true,
                    "type": "BMM_PACKAGE"
                },
                "properties": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "properties",
                    "documentation": "List of attributes defined in this class.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_PROPERTY"
                        ]
                    }
                },
                "source_schema_id": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "source_schema_id",
                    "documentation": "Reference to original source schema defining this class. Useful for UI tools to determine which original schema file to open for a given class for manual editing.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "immediate_descendants": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "immediate_descendants",
                    "documentation": "List of immediate inheritance descendants.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "is_abstract": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_abstract",
                    "documentation": "True if this class is abstract in its model.",
                    "is_mandatory": true,
                    "type": "Boolean"
                },
                "is_primitive_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_primitive_type",
                    "documentation": "True if this class is designated a primitive type within the overall type system of the schema.",
                    "is_mandatory": true,
                    "type": "Boolean"
                },
                "is_override": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "is_override",
                    "documentation": "True if this definition overrides a class of the same name in an included schema.",
                    "is_mandatory": true,
                    "type": "Boolean"
                }
            },
            "functions": {
                "all_ancestors": {
                    "name": "all_ancestors",
                    "documentation": "List of all inheritance parent class names, recursively.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "all_descendants": {
                    "name": "all_descendants",
                    "documentation": "Compute all descendants by following immediate_descendants.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "suppliers": {
                    "name": "suppliers",
                    "documentation": "List of names of immediate supplier classes, including concrete generic parameters, concrete descendants of abstract statically defined types, and inherited suppliers. This list includes primitive types.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "suppliers_non_primitive": {
                    "name": "suppliers_non_primitive",
                    "documentation": "Same as `suppliers' minus primitive types, as defined in input schema.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "supplier_closure": {
                    "name": "supplier_closure",
                    "documentation": "List of names of all classes in full supplier closure, including concrete generic parameters. This list includes primitive types.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "base_class": {
                    "name": "base_class",
                    "documentation": "Main design class for this type, from which properties etc can be extracted.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_CLASS"
                    }
                },
                "package_path": {
                    "name": "package_path",
                    "documentation": "Fully qualified package name, of form: 'package.package'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "class_path": {
                    "name": "class_path",
                    "documentation": "Fully qualified class name, of form: 'package.package.CLASS' with package path in lower-case and class in original case.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "flat_properties": {
                    "name": "flat_properties",
                    "documentation": "List of all properties due to current and ancestor classes, keyed by property name.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "BMM_PROPERTY"
                    },
                    "is_nullable": true
                },
                "type_name": {
                    "name": "type_name",
                    "documentation": "Formal string form of the type as per UML.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_GENERIC_CLASS": {
            "name": "BMM_GENERIC_CLASS",
            "documentation": "Definition of a generic class in an object model.",
            "ancestors": [
                "BMM_CLASS"
            ],
            "properties": {
                "generic_parameters": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "generic_parameters",
                    "documentation": "List of generic parameter definitions, keyed by name of generic parameter; these are defined either directly on this class or by the addition of an ancestor class which is generic.",
                    "is_mandatory": true,
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_GENERIC_PARAMETER"
                        ]
                    }
                }
            },
            "functions": {
                "suppliers": {
                    "name": "suppliers",
                    "documentation": "Add suppliers from generic parameters.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                },
                "type_signature": {
                    "name": "type_signature",
                    "documentation": "Signature form of the type, which for generics includes generic parameter constrainer types e.g. Interval<T:Ordered>.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "type_name": {
                    "name": "type_name",
                    "documentation": "Formal string form of the type as per UML.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_ENUMERATION": {
            "name": "BMM_ENUMERATION",
            "documentation": "Definition of an enumeration type. In the BMM system, an 'enumeration' type is understood as an underlying basic type and a set of named constants of that type. It is designed so that the default type is Integer, and the default constants are numbered 0, 1, ... Optional model elements can be specified to override the values and / or the type.",
            "ancestors": [
                "BMM_CLASS"
            ],
            "properties": {
                "item_names": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "item_names",
                    "documentation": "The list of names of the enumeration. If no values are supplied, the integer values 0, 1, 2, ... are assumed.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "item_values": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "item_values",
                    "documentation": "Optional list of specific values. Must be 1:1 with `item_names' list.",
                    "type_def": {
                        "container_type": "List",
                        "type": "T"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "underlying_type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "underlying_type_name",
                    "documentation": "Name of type any concrete BMM_ENUMERATION_* sub-type is based on, i.e. the name of type bound to 'T' in a declared use of this type.",
                    "is_mandatory": true,
                    "type": "String"
                }
            }
        },
        "BMM_ENUMERATION_INTEGER": {
            "name": "BMM_ENUMERATION_INTEGER",
            "documentation": "Integer-based enumeration type.",
            "ancestors": [
                "BMM_ENUMERATION"
            ],
            "properties": {
                "underlying_type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "underlying_type_name",
                    "documentation": "Name of type any concrete BMM_ENUMERATION_* sub-type is based on. Redefined to \"INTEGER\".",
                    "is_mandatory": true,
                    "default": "\"INTEGER\"",
                    "type": "String"
                }
            }
        },
        "BMM_ENUMERATION_STRING": {
            "name": "BMM_ENUMERATION_STRING",
            "documentation": "String-based enumeration type.",
            "ancestors": [
                "BMM_ENUMERATION"
            ],
            "properties": {
                "underlying_type_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "underlying_type_name",
                    "documentation": "Name of type any concrete BMM_ENUMERATION_* sub-type is based on. Redefined to \"STRING\".",
                    "is_mandatory": true,
                    "default": "\"STRING\"",
                    "type": "String"
                }
            }
        },
        "BMM_TYPE_ELEMENT": {
            "name": "BMM_TYPE_ELEMENT",
            "documentation": "",
            "is_abstract": true,
            "ancestors": [
                "BMM_CLASSIFIER"
            ]
        },
        "BMM_TYPE": {
            "name": "BMM_TYPE",
            "documentation": "Abstract idea of specifying a type in some context. This is not the same as 'defining' a class. A type specification is essentially a reference of some kind, that defines the type of an attribute, or function result or argument. It may include generic parameters that might or might not be bound. See subtypes.",
            "is_abstract": true,
            "ancestors": [
                "BMM_TYPE_ELEMENT"
            ],
            "functions": {
                "has_type_substitutions": {
                    "name": "has_type_substitutions",
                    "documentation": "Determine if there are any type substitutions.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                },
                "type_substitutions": {
                    "name": "type_substitutions",
                    "documentation": "List of type substitutions if any available for this type within the current BMM model.",
                    "result": {
                        "_type": "P_BMM_CONTAINER_TYPE",
                        "container_type": "List",
                        "type": "String"
                    },
                    "is_nullable": true
                }
            }
        },
        "BMM_SIMPLE_TYPE": {
            "name": "BMM_SIMPLE_TYPE",
            "documentation": "Type reference to a single type i.e. not generic or container type.",
            "ancestors": [
                "BMM_TYPE"
            ],
            "properties": {
                "base_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "base_class",
                    "documentation": "The target type; this converts to the first parameter in generic_parameters in BMM_GENERIC_TYPE.",
                    "is_mandatory": true,
                    "type": "BMM_CLASS"
                }
            },
            "functions": {
                "type_name": {
                    "name": "type_name",
                    "documentation": "Return base_class.type_name.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_OPEN_TYPE": {
            "name": "BMM_OPEN_TYPE",
            "documentation": "Open type reference to a single type parameter, i.e. typically 'T', 'V', 'K' etc. The parameter must be in the type declaration of the owning BMM_CLASS.",
            "ancestors": [
                "BMM_TYPE"
            ],
            "properties": {
                "generic_constraint": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "generic_constraint",
                    "documentation": "The generic constraint, which will be 'Any' if nothing set in original model.",
                    "is_mandatory": true,
                    "type": "BMM_GENERIC_PARAMETER"
                }
            },
            "functions": {
                "conformance_type_name": {
                    "name": "conformance_type_name",
                    "documentation": "Return generic_constraint.conformance_type_name.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_CONTAINER_TYPE": {
            "name": "BMM_CONTAINER_TYPE",
            "documentation": "Type reference that specifies containers with one generic parameter.",
            "ancestors": [
                "BMM_TYPE"
            ],
            "properties": {
                "container_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "container_type",
                    "documentation": "The type of the container. This converts to the root_type in BMM_GENERIC_TYPE.",
                    "is_mandatory": true,
                    "type": "BMM_CLASS"
                },
                "base_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "base_type",
                    "documentation": "The target type; this converts to the first parameter in generic_parameters in BMM_GENERIC_TYPE.",
                    "is_mandatory": true,
                    "type": "BMM_TYPE"
                }
            },
            "functions": {
                "type_name": {
                    "name": "type_name",
                    "documentation": "Return full type name, e.g. 'List<ELEMENT>'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_INDEXED_CONTAINER_TYPE": {
            "name": "BMM_INDEXED_CONTAINER_TYPE",
            "documentation": "Type reference that specifies an indexed container such as `Hash<K,V>`, i.e. a container whose members are accessed via a key (index) type.",
            "ancestors": [
                "BMM_CONTAINER_TYPE"
            ],
            "properties": {
                "index_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "index_type",
                    "documentation": "The key (index) type of the container, e.g. `String` in `Hash<String,EVENT_ACTION>`.",
                    "is_mandatory": true,
                    "type": "BMM_SIMPLE_TYPE"
                }
            }
        },
        "BMM_GENERIC_TYPE": {
            "name": "BMM_GENERIC_TYPE",
            "documentation": "Type reference based on a generic class, e.g. 'HashTable <List <Packet>, String>'.",
            "ancestors": [
                "BMM_TYPE"
            ],
            "properties": {
                "generic_parameters": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "generic_parameters",
                    "documentation": "Generic parameters of the root_type in this type specifier. The order must match the order of the owning class's formal generic parameter declarations.",
                    "is_mandatory": true,
                    "type_def": {
                        "container_type": "List",
                        "type": "BMM_TYPE"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "base_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "base_class",
                    "documentation": "The base class of this type.",
                    "is_mandatory": true,
                    "type": "BMM_GENERIC_CLASS"
                }
            },
            "functions": {
                "type_name": {
                    "name": "type_name",
                    "documentation": "Return the full name of the type including generic parameters, e.g. 'DV_INTERVAL<T>', 'TABLE<List<THING>,String>'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "BMM_GENERIC_PARAMETER": {
            "name": "BMM_GENERIC_PARAMETER",
            "documentation": "Definition of a generic parameter in a class definition of a generic type.",
            "ancestors": [
                "BMM_TYPE_ELEMENT"
            ],
            "properties": {
                "name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "name",
                    "documentation": "Name of the parameter, e.g. 'T' etc. The name is limited to 1 character and upper-case.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "conforms_to_type": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "conforms_to_type",
                    "documentation": "Optional conformance constraint that must be another valid class name.",
                    "type": "BMM_CLASS"
                },
                "inheritance_precursor": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "inheritance_precursor",
                    "documentation": "If set, is the corresponding generic parameter definition in an ancestor class.",
                    "type": "BMM_GENERIC_PARAMETER"
                }
            },
            "functions": {
                "flattened_conforms_to_type": {
                    "name": "flattened_conforms_to_type",
                    "documentation": "Get any ultimate type conformance constraint on this generic parameter due to inheritance.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                },
                "effective_conforms_to_type": {
                    "name": "effective_conforms_to_type",
                    "documentation": "Generate ultimate conformance type, which is either from `conforms_to_type' or if not set, 'Any'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "BMM_CLASS"
                    }
                },
                "type_signature": {
                    "name": "type_signature",
                    "documentation": "Signature form of the open type, including constrainer type if there is one, e.g. 'T:Ordered'.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            },
            "invariants": {
                "Inv_generic_name": "name.count = 1 and name.is_upper"
            }
        },
        "BMM_SCHEMA_CORE": {
            "name": "BMM_SCHEMA_CORE",
            "documentation": "Core properties of BMM_SCHEMA.",
            "properties": {
                "rm_publisher": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "rm_publisher",
                    "documentation": "Publisher of model expressed in the schema. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "rm_release": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "rm_release",
                    "documentation": "Release of model expressed in the schema as a 3-part numeric, e.g. \"3.1.0\". Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "schema_name": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema_name",
                    "documentation": "Name of model expressed in schema; a 'schema' usually contains all of the packages of one 'model' of a publisher. A publisher with more than one model can have multiple schemas. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "schema_revision": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema_revision",
                    "documentation": "Revision of schema. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "schema_lifecycle_state": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema_lifecycle_state",
                    "documentation": "Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "schema_author": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema_author",
                    "documentation": "Primary author of schema. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "schema_description": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema_description",
                    "documentation": "Description of schema. Persisted attribute.",
                    "is_mandatory": true,
                    "type": "String"
                },
                "schema_contributors": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "schema_contributors",
                    "documentation": "Contributing authors of schema. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "archetype_parent_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "archetype_parent_class",
                    "documentation": "Name of a parent class used within the schema to provide archetype capability, enabling filtering of classes in RM visualisation. If empty, 'Any' is assumed. Persisted attribute.",
                    "type": "String"
                },
                "archetype_data_value_parent_class": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "archetype_data_value_parent_class",
                    "documentation": "Name of a parent class of logical 'data types' used within the schema to provide archetype capability, enabling filtering of classes in RM visualisation. If empty, 'Any' is assumed. Persisted attribute.",
                    "type": "String"
                },
                "archetype_rm_closure_packages": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "archetype_rm_closure_packages",
                    "documentation": "List of top-level package paths that provide the RM 'model' part in archetype identifiers, e.g. the path \"org.openehr.ehr\" gives \"EHR\" in \"openEHR-EHR\". Within this namespace, archetypes can be based on any class reachable from classes defined directly in these packages. Persisted attribute.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "archetype_visualise_descendants_of": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "archetype_visualise_descendants_of",
                    "documentation": "If archetype_parent_class is not set, designate a class whose descendants should be made visible in tree and grid renderings of the archetype definition. Persisted attribute.",
                    "type": "String"
                }
            },
            "functions": {
                "schema_id": {
                    "name": "schema_id",
                    "documentation": "Derived name of schema, based on model publisher, model name, model release.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "String"
                    }
                }
            }
        },
        "REFERENCE_MODEL_ACCESS": {
            "name": "REFERENCE_MODEL_ACCESS",
            "documentation": "Access to service interface to BMM object model.",
            "ancestors": [
                "BMM_DEFINITIONS"
            ],
            "properties": {
                "schema_directories": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "schema_directories",
                    "documentation": "List of directories where all the schemas loaded here are found.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                },
                "all_schemas": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "all_schemas",
                    "documentation": "All schemas found and loaded from `schema_directories`. Keyed by schema_id, i.e. model_publisher '_' schema_name '_' model_release, e.g. openehr_rm_1.0.3.",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "SCHEMA_DESCRIPTOR"
                        ]
                    }
                },
                "valid_models": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "valid_models",
                    "documentation": "Top-level (root) models in use. Keyed by logical schema_name, i.e. model_publisher '_' model_name, e.g. \"openehr_rm\".",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "BMM_MODEL"
                        ]
                    }
                }
            },
            "functions": {
                "initialise_with_load_list": {
                    "name": "initialise_with_load_list",
                    "documentation": "Initialise with a specific schema load list, usually a sub-set of schemas that will be found in the directories `a_schema_dirs`.",
                    "parameters": {
                        "a_schema_dirs": {
                            "_type": "P_BMM_CONTAINER_FUNCTION_PARAMETER",
                            "name": "a_schema_dirs",
                            "is_nullable": false,
                            "type_def": {
                                "container_type": "List",
                                "type": "String"
                            },
                            "cardinality": {
                                "lower": 1,
                                "upper_unbounded": true
                            }
                        },
                        "a_schema_load_list": {
                            "_type": "P_BMM_CONTAINER_FUNCTION_PARAMETER",
                            "name": "a_schema_load_list",
                            "is_nullable": true,
                            "type_def": {
                                "container_type": "List",
                                "type": "String"
                            },
                            "cardinality": {
                                "lower": 0,
                                "upper_unbounded": true
                            }
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "initialise_all": {
                    "name": "initialise_all",
                    "documentation": "Initialise with all schemas found in the schema directories.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "reload_schemas": {
                    "name": "reload_schemas",
                    "documentation": "Reload all schemas.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            }
        },
        "SCHEMA_DESCRIPTOR": {
            "name": "SCHEMA_DESCRIPTOR",
            "documentation": "Descriptor for a BMM schema. Contains a meta-data table of attributes obtained from a mini-ODIN parse of the schema file.",
            "ancestors": [
                "BMM_DEFINITIONS"
            ],
            "properties": {
                "p_schema": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "p_schema",
                    "documentation": "Persistent form of model.",
                    "type": "P_BMM_SCHEMA"
                },
                "schema": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema",
                    "documentation": "Computable form of model.",
                    "type": "BMM_MODEL"
                },
                "schema_id": {
                    "_type": "P_BMM_SINGLE_PROPERTY",
                    "name": "schema_id",
                    "is_mandatory": true,
                    "documentation": "Schema id, formed from meta_data model_publisher '_' schema_name '_' model_release, e.g. openehr_rm_1.0.3.",
                    "type": "String"
                },
                "meta_data": {
                    "_type": "P_BMM_GENERIC_PROPERTY",
                    "name": "meta_data",
                    "is_mandatory": true,
                    "documentation": "Table of {key, value} pairs of schema meta-data (bmm_version, model_publisher, schema_name, model_release, schema_revision, schema_lifecycle_state, schema_description, schema_path).",
                    "type_def": {
                        "root_type": "Hash",
                        "generic_parameters": [
                            "String",
                            "String"
                        ]
                    }
                },
                "includes": {
                    "_type": "P_BMM_CONTAINER_PROPERTY",
                    "name": "includes",
                    "documentation": "Schema_ids of schemas included by this schema.",
                    "type_def": {
                        "container_type": "List",
                        "type": "String"
                    },
                    "cardinality": {
                        "lower": 0,
                        "upper_unbounded": true
                    }
                }
            },
            "functions": {
                "is_top_level": {
                    "name": "is_top_level",
                    "documentation": "True if this is a top-level schema, i.e. not included by some other schema.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                },
                "is_bmm_compatible": {
                    "name": "is_bmm_compatible",
                    "documentation": "True if the BMM version found in the schema (or assumed, if none) is compatible with that in this software.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "Boolean"
                    }
                },
                "load": {
                    "name": "load",
                    "documentation": "Load schema into in-memory form.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "validate": {
                    "name": "validate",
                    "documentation": "Validate entire schema.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "validate_includes": {
                    "name": "validate_includes",
                    "documentation": "Validate includes list for this schema, to see if each mentioned schema exists in read schemas.",
                    "parameters": {
                        "all_schemas_list": {
                            "_type": "P_BMM_CONTAINER_FUNCTION_PARAMETER",
                            "name": "all_schemas_list",
                            "is_nullable": true,
                            "type_def": {
                                "container_type": "List",
                                "type": "String"
                            },
                            "cardinality": {
                                "lower": 0,
                                "upper_unbounded": true
                            }
                        }
                    },
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                },
                "create_schema": {
                    "name": "create_schema",
                    "documentation": "Create `schema`.",
                    "result": {
                        "_type": "P_BMM_SIMPLE_TYPE",
                        "type": "void"
                    }
                }
            }
        }
    }
}
