# Object Types

Sub-classing objects&#x20;

In your data modeling, you may find that you want to define an object class that inherits all properties from another. For example, you might have a generic `c_assessment` class with properties like `c_patient` and more specific classes like `c_blood_test` that has all the properties of `c_assessment` but also a set of more specific properties like `c_blood_type`.

To create an object type, you simply add the object type definitions into the `objectTypes` array of an object's definition. These types will inherit all the properties from the super-class (or super-type).

The properties that define an object type are as follows:

### Object Type Properties

| Name       | Type                      | Description                                                                   |
| ---------- | ------------------------- | ----------------------------------------------------------------------------- |
| name       | String                    | The API name for the object type                                              |
| label      | String                    | The human readable label for the object type                                  |
| properties | Property Definition Array | The array of property definitions for properties specific to this object type |

{% hint style="info" %}
Once an object type is defined, the `type` property becomes required when creating instances of the object. The `type` property is populated with the name of the object type you are creating.
{% endhint %}

### Examples

In this example, we've created the object class `c_assessment` and set the proper ACL's. We've also added a property to this object that all of this object's types will share: `c_patient`. This is because all assessments will be made on a particular patient, no matter what kind of assessment it is.

{% tabs %}
{% tab title="Request" %}

```
GET /objects/5951719d514ef101000216cf
```

{% endtab %}

{% tab title="Assessment Object Definition" %}

```javascript
{
    "_id": "5951719d514ef101000216cf",
    "access": 7,
    "allowConnections": true,
    "allowTransfers": true,
    "connectionOptions": {
        "requireAccept": true,
        "requiredAccess": 5,
        "sendNotifications": true
    },
    "createAcl": [
        {
            "_id": "5951719dfc65ed0100e62068",
            "allow": 1,
            "target": "000000000000000000000003",
            "type": 1
        }
    ],
    "created": "2017-06-26T20:42:05.183Z",
    "creator": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "defaultAcl": [
        {
            "_id": "5951719dfc65ed0100e62069",
            "allow": 7,
            "target": null,
            "type": 4
        }
    ],
    "favorite": false,
    "feedDefinition": [],
    "label": "Assessment",
    "lookup": "5951719d514ef101000216cf",
    "name": "c_assessment",
    "object": "object",
    "objectTypes": [],
    "pluralName": "c_assessments",
    "properties": [
        {
            "_id": "595171e811f6710100683480",
            "acl": [],
            "auditable": false,
            "autoCreate": false,
            "cascadeDelete": true,
            "creatable": false,
            "expandable": true,
            "grant": 0,
            "indexed": true,
            "label": "Patient",
            "name": "c_patient",
            "optional": false,
            "pacl": [],
            "paths": [],
            "readAccess": 4,
            "readable": true,
            "referenceAccess": 5,
            "removable": false,
            "sourceObject": "account",
            "type": "Reference",
            "unique": false,
            "validators": [
                {
                    "_id": "595171e811f6710100683481",
                    "name": "required"
                }
            ],
            "writable": true,
            "writeAccess": 6
        }
    ],
    "shareChain": [
        5,
        4,
        2
    ],
    "updated": "2017-06-26T20:43:21.022Z",
    "updater": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    }
}
```

{% endtab %}
{% endtabs %}

You'll notice that the `objectTypes` value in the JSON result above is an empty array. We're going to add a `c_blood_test` object type to this array.

{% tabs %}
{% tab title="Request" %}

```
POST /objects/5951719d514ef101000216cf/objectTypes
```

{% endtab %}

{% tab title="Object Type Request Body" %}

```javascript
{
    "label":"Blood Test",
    "name":"c_blood_test",
    "properties": [
        {
            "label":"Blood Type",
            "name":"c_blood_type",
            "type": "String",
            "validators": [
                {
                    "name": "required"
                }
            ]
        }
    ]
}
```

{% endtab %}
{% endtabs %}

Now, the objectTypes array contains the `c_blood_test` definition we just created.

{% tabs %}
{% tab title="Request" %}

```
GET /objects/5951719d514ef101000216cf/objectTypes
```

{% endtab %}

{% tab title="objectTypes array" %}

```javascript
{
    "data": [
        {
            "_id": "5951751611f6710100683fdc",
            "label": "Blood Test",
            "name": "c_blood_test",
            "properties": [
                {
                    "_id": "5951751611f6710100683fdd",
                    "acl": [],
                    "array": false,
                    "auditable": false,
                    "canPull": true,
                    "canPush": true,
                    "creatable": false,
                    "indexed": false,
                    "label": "Blood Type",
                    "lowercase": false,
                    "maxItems": 100,
                    "maxShift": false,
                    "minItems": 0,
                    "name": "c_blood_type",
                    "optional": false,
                    "readAccess": 4,
                    "readable": true,
                    "removable": false,
                    "trim": false,
                    "type": "String",
                    "unique": false,
                    "uniqueValues": false,
                    "uppercase": false,
                    "validators": [
                        {
                            "_id": "5951751611f6710100683fde",
                            "name": "required"
                        }
                    ],
                    "writable": true,
                    "writeAccess": 6,
                    "writeOnCreate": true
                }
            ]
        }
    ],
    "hasMore": false,
    "object": "list"
}
```

{% endtab %}
{% endtabs %}

We can now create a `c_assessment` object instance of type `c_blood_test`:

{% tabs %}
{% tab title="Request" %}

```
POST /c_assessments
```

{% endtab %}

{% tab title="Request Body" %}

```
{
    "c_patient":"5771495a1d0c03a53ce83f1a",
    "type":"c_blood_test",
    "c_blood_type":"Type A"
}
```

{% endtab %}
{% endtabs %}

The resulting instance of `c_assessment` is of `type: c_blood_test` and contains both the base property of `c_patient` and the `c_blood_test` type property `c_blood_type`.Request&#x20;

{% tabs %}
{% tab title="Result" %}

```javascript
{
    "_id": "59517718cfc40501006da501",
    "access": 7,
    "c_blood_type": "Type A",
    "c_patient": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "created": "2017-06-26T21:05:28.068Z",
    "creator": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "favorite": false,
    "object": "c_assessment",
    "owner": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "shared": false,
    "type": "c_blood_test"
}
```

{% endtab %}
{% endtabs %}
