protected function _processFindOrCreate($search, callable $callback = null, $options = [])
{
if (is_callable($search)) {
$query = $this->find();
$search($query);
} elseif (is_array($search)) {
$query = $this->find()->where($search);
} elseif ($search instanceof Query) {
$query = $search;
} else {
throw new InvalidArgumentException('Search criteria must be an array, callable or Query');
}
$row = $query->first();
if ($row !== null) {
return $row;
}
$entity = $this->newEntity();
if ($options['defaults'] && is_array($search)) {
$entity->set($search, ['guard' => false]);
}
if ($callback !== null) {
$entity = $callback($entity) ?: $entity;
}
unset($options['defaults']);
return $this->save($entity, $options) ?: $entity;
}