public function create_store_from_config($name, array $details, cache_definition $definition) {
        if (!array_key_exists($name, $this->stores)) {
            // Properties: name, plugin, configuration, class.
            $class = $details['class'];
            if (!$class::are_requirements_met()) {
                return false;
            }
            $store = new $class($details['name'], $details['configuration']);
            $this->stores[$name] = $store;
        }
        /* @var cache_store $store */
        $store = $this->stores[$name];
        // We check are_requirements_met although we expect is_ready is going to check as well.
        if (!$store::are_requirements_met() || !$store->is_ready() || !$store->is_supported_mode($definition->get_mode())) {
            return false;
        }
        // We always create a clone of the original store.
        // If we were to clone a store that had already been initialised with a definition then
        // we'd run into a myriad of issues.
        // We use a method of the store to create a clone rather than just creating it ourselves
        // so that if any store out there doesn't handle cloning they can override this method in
        // order to address the issues.
        $store = $this->stores[$name]->create_clone($details);
        $store->initialise($definition);
        $definitionid = $definition->get_id();
        if (!isset($this->definitionstores[$definitionid])) {
            $this->definitionstores[$definitionid] = array();
        }
        $this->definitionstores[$definitionid][] = $store;
        return $store;
    }