Как использовать два трейта, переопределяющих метод?

Есть репозиторий, в нем есть метод для подготовки данных на изменение

class Repository
{
    protected function prepareSaveData($data, $id = null)
    {
        return $data;
    }
}

И есть 2 трейта, которые переопределяют этот метод (можно не читать что они делают, они просто есть и переопределяют метод)

trait DatedTrait
{
    protected function prepareSaveData($data, $id = null) {
        if ($id) {
            if (array_search('date_update', $this->fields) && !($data['date_update'] ?? null)) {
                $data['date_update'] = date('Y-m-d H:i:s');
            }
        } else {
            if (array_search('date_create', $this->fields) && !($data['date_create'] ?? null)) {
                $data['date_create'] = date('Y-m-d H:i:s');
            }
        }

        return parent::prepareSaveData($data, $id);
    }
}
trait OptionsTrait
{
    protected function prepareSaveData(
        $data,
        $id = null
    ) {
        $options = [];
        if ($id) {
            $item = $this->getItem($id);
            if ($item) {
                $options = json_decode($item['options'], true) ?: [];
            }
        }

        foreach ($this->optionsFields as $fieldname) {
            if (isset($data[$fieldname])) {
                $options[$fieldname] = $data[$fieldname];
            }
        }

        $data['options'] = json_encode($options);

        return parent::prepareSaveData($data, $id);
    }
}

Каким-то репам нужен DatedTrait, каким-то OptionsTrait, но вот одному репу понадобились они оба и у меня не получается их использовать вместе.

Вот до чего я дошел:

class ConcreteRepository extends Repository
{
    use OptionsTrait {
        prepareSaveData as prepareOptionsSaveData;
    }

    use DatedTrait {
        prepareSaveData as prepareDatedSaveData;
    }

    protected function prepareSaveData(
        $data,
        $id = null
    ) {
        $data = $this->prepareDatedSaveData($data, $id);
        $data = $this->prepareOptionsSaveData($data, $id);
        return parent::prepareSaveData($data, $id);
    }
}

Но в данном случае работает только первый подключенный трейт, метод второго не вызывается и даже нотиса нет. Подскажите, плз, как решить проблему?

P.S. Были выбраны трейты, т.к. нельзя использовать множественное наследование, чтобы не плодить классы типа DatedRepository, OptionsRepository, DatedOptionsRepository, DatedOptionsExtraFeatureRepository и тд...


Ответы (2 шт):

Автор решения: WinterSilence

капитан очевидность рекомендует декоратор: создаем 2 класса в каждом по трейту и класс-декоратор в который передаются объекты этих классов

→ Ссылка
Автор решения: Skywave

Как подсказал @teran, надо изменить конструкцию подключения трейтов на такую:

use OptionsTrait, DatedTrait {
    OptionsTrait::prepareSaveData as prepareOptionsSaveData;
    DatedTrait::prepareSaveData as prepareDatedSaveData;
}
→ Ссылка