MatterGameObject = function (world, gameObject, options, addToWorld)
{
    if (options === undefined) { options = {}; }
    if (addToWorld === undefined) { addToWorld = true; }

    var x = gameObject.x;
    var y = gameObject.y;

    //  Temp body pos to avoid body null checks
    gameObject.body = {
        temp: true,
        position: {
            x: x,
            y: y
        }
    };

    var mixins = [
        Components.Bounce,
        Components.Collision,
        Components.Force,
        Components.Friction,
        Components.Gravity,
        Components.Mass,
        Components.Sensor,
        Components.SetBody,
        Components.Sleep,
        Components.Static,
        Components.Transform,
        Components.Velocity
    ];

    //  First let's inject all of the components into the Game Object
    mixins.forEach(function (mixin)
    {
        for (var key in mixin)
        {
            if (hasGetterOrSetter(mixin[key]))
            {
                Object.defineProperty(gameObject, key, {
                    get: mixin[key].get,
                    set: mixin[key].set
                });
            }
            else
            {
                Object.defineProperty(gameObject, key, {value: mixin[key]});
            }
        }

    });

    gameObject.world = world;

    gameObject._tempVec2 = new Vector2(x, y);

    if (options.hasOwnProperty('type') && options.type === 'body')
    {
        gameObject.setExistingBody(options, addToWorld);
    }
    else
    {
        var shape = GetFastValue(options, 'shape', null);

        if (!shape)
        {
            shape = 'rectangle';
        }

        options.addToWorld = addToWorld;

        gameObject.setBody(shape, options);
    }

    return gameObject;
}
A Matter Game Object is a generic object that allows you to combine any Phaser Game Object,
including those you have extended or created yourself, with all of the Matter Components.

This enables you to use component methods such as `setVelocity` or `isSensor` directly from
this Game Object.

@function Phaser.Physics.Matter.MatterGameObject
@since 3.3.0

@param {Phaser.Physics.Matter.World} world - The Matter world to add the body to.
@param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will have the Matter body applied to it.
@param {(Phaser.Types.Physics.Matter.MatterBodyConfig|MatterJS.Body)} [options] - A Matter Body configuration object, or an instance of a Matter Body.
@param {boolean} [addToWorld=true] - Should the newly created body be immediately added to the World?

@return {Phaser.GameObjects.GameObject} The Game Object that was created with the Matter body.