# Mixins

## Overview

A mixin is an entity that captures reusable data properties and methods, but cannot be instantiated. The reason we have mixins is because the our object model uses single inheritance—meaning a class can only have one class as its base class. If we want multiple classes to share data properties and methods from multiple entity types, then it is not possible.

## Creating a Mixin

You create a mixin using the `Mixin.create()` method. The create method takes a definition hash that contains data properties and methods, which is similar to how you created a class.

{% code title="events.js" %}

```javascript
const {Mixin} = require ('@onehilltech/blueprint');

const Events = Mixin.create ({
  on (name, method) { 
    // ...
  },
  once (name, method) { 
    // ...
  }
  emit (name, ...args) { 
    // ...
  }
});
```

{% endcode %}

## Using a Mixin

Once we have created a mixin, you can use it in two ways. The first approach is [applying the mixin to the class definition](/developer-guide/the-object-model/mixins.md#applying-mixin-to-class-definition). When you apply a mixin to a class definition, all instances of the class will have the mixin as part of their definition. The second approach is to [apply the mixin to an instance](/developer-guide/the-object-model/mixins.md#applying-mixin-to-object-instance) when it is created. When we use this approach, only the created instance will have the mixin as part of its definition. It does not impact the other instances of the class.

### Applying Mixin to Class Definition

The `extend()` method takes optional list of mixins before the class definition.&#x20;

{% hint style="info" %}
The signature of the `extend()` method is`BO.extend ([Mixin1, Mixin2, Mixin3,] definition)`.
{% endhint %}

For example, let's assume we want to mix in the `Events` mixin with the `Person` class. We can do that by preceding the definition with the mixin.

```javascript
const { BO } = require ('@onehilltech/blueprint');
const Events = require ('./events');

const Person = BO.extend (Events, {
  // The person class definition
});
```

Now, anytime we create a `Person` class, it will have access to the methods and data properties defined in the `Events` mixin.

### Applying Mixin to Object Instance

Similar to the `extend()` method, the `create()` method takes optional list of mixins that before the class definition.&#x20;

{% hint style="info" %}
The signature of the `create()` method is`BO.create ([Mixin1, Mixin2, Mixin3,] definition)`
{% endhint %}

For example, let's assume we want to mix in the `Events` mixin with the `Person` class. We can do that by preceding the definition with the mixin.

```javascript
const { BO } = require ('@onehilltech/blueprint');
const Events = require ('./events');

let president = Person.create (Events, {
  firstName: 'Barack',
  lastName: 'Obama'
});
```

Now, only the `president` instance will have access to the methods and data properties defined in the `Events` mixin.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blueprint.onehilltech.com/developer-guide/the-object-model/mixins.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
