<?php
namespace nur\sery\wip\php\access;

/**
 * Class ShadowAccess: accès en lecture depuis une instance de {@link IAccess}
 * puis écriture dans une autre instance de {@link IAccess}
 *
 * l'objet est initialisé avec deux instances de {@link IAccess}: $reader et
 * $writer
 * - au départ, les méthodes de {@link IGetter} attaquent $reader et les
 * méthodes de {@link ISetter} et {@link IDeleter} attaquent $writer
 * - dès qu'une méthode de {@link ISetter} est utilisée, les méthodes de
 * {@link IGetter} attaquent $writer
 * - si une méthode de {@link IDeleter} est utilisée, les méthodes de
 * {@link IGetter} attaquent de nouveau $reader comme initialement
 */
class ShadowAccess extends AbstractAccess {
  function __construct(IAccess $reader, IAccess $writer) {
    $this->reader = $reader;
    $this->writer = $writer;
    $this->getter = $reader;
  }

  protected IAccess $reader;

  protected IAccess $writer;

  protected IGetter $getter;

  function exists(): bool {
    return $this->getter->exists();
  }

  function available(): bool {
    return $this->getter->available();
  }

  function get($default=null) {
    return $this->getter->get($default);
  }

  function set($value): void {
    $this->writer->set($value);
    $this->getter = $this->writer;
  }

  public function del(): void {
    $this->writer->del();
    $this->getter = $this->reader;
  }
}