public function start($id, Parameters $parameters = null)
    {
        if (null !== $id) {
            $resource = str_replace('{id}', $id, static::RESOURCE_OBJECT_START);
        } else {
            $key = $parameters->getKey();
            $tenantId = $parameters->getTenantId();

            switch (true) {
                case null !== $key && null !== $tenantId:
                    $resource = str_replace(['{key}', '{tenant-id}'], [$key, $tenantId], static::RESOURCE_OBJECT_START_BY_KEY_AND_TENANT_ID);
                    break;

                case null !== $key:
                    $resource = str_replace('{key}', $key, static::RESOURCE_OBJECT_START_BY_KEY);
                    break;

                default:
                    throw new LogicException('"Key" and/or "TenantId" parameters are not defined.');
            }
        }

        $options = [
            'headers' => [
                'Accept' => 'application/json',
                'Content-Type' => 'application/json'
            ]
        ];

        if ($parameters) {
            $parameters = (array) $parameters->toObject(true);

            foreach ($parameters as $name => $value) {
                switch ($name) {
                    case 'variables':
                        foreach ($value as $variable) {
                            $options['json'][$name][$variable->name] = [
                                'value' => Variable::TYPE_JSON === $variable->type ? json_encode($variable->value) : $variable->value,
                                'type' => $variable->type
                            ];
                        }

                        break;

                    case 'key':
                        break;

                    default:
                        $options['json'][$name] = $value;
                }
            }
        }

        $object = $this->execute('POST', $resource, $options);
        $model = ProcessInstanceService::toModel($object);

        return $model;
    }