public function bulkLoad(array $keys, $fallback = NULL)
{
if (count($keys) === 0) {
return [];
}
foreach ($keys as $key) {
if (!is_scalar($key)) {
throw new Nette\InvalidArgumentException('Only scalar keys are allowed in bulkLoad()');
}
}
$storageKeys = array_map([$this, 'generateKey'], $keys);
if (!$this->storage instanceof IBulkReader) {
$result = array_combine($keys, array_map([$this->storage, 'read'], $storageKeys));
if ($fallback !== NULL) {
foreach ($result as $key => $value) {
if ($value === NULL) {
$result[$key] = $this->save($key, function (&$dependencies) use($key, $fallback) {
return call_user_func_array($fallback, [$key, &$dependencies]);
});
}
}
}
return $result;
}
$cacheData = $this->storage->bulkRead($storageKeys);
$result = [];
foreach ($keys as $i => $key) {
$storageKey = $storageKeys[$i];
if (isset($cacheData[$storageKey])) {
$result[$key] = $cacheData[$storageKey];
} elseif ($fallback) {
$result[$key] = $this->save($key, function (&$dependencies) use($key, $fallback) {
return call_user_func_array($fallback, [$key, &$dependencies]);
});
} else {
$result[$key] = NULL;
}
}
return $result;
}