<?php
namespace nur\b\coll;

/**
 * Class BaseArray: implémentation de base d'un tableau
 *
 * Les classes dérivées *doivent* implémenter les méthodes has(), get(), set()
 * et del() qui peuvent simplement être implémentée comme des méthodes déléguées
 * de respectivement {@link _has()}, {@link _get()}, {@link _set()} et
 * {@link _del()}.
 *
 * Ce mode opératoire permet de créer ces méthodes avec une signature appropriée,
 * permettant à un IDE de découvrir le type des données qui sont accédées
 */
abstract class BaseArray implements IArray {
  use TBaseArray;

  function __construct(?array $data=null) {
    if ($data === null) $data = [];
    $this->data = $data;
  }

  static function __set_state(array $data): self {
    $array = new static();
    foreach ($data as $key => $value) {
      $array->$key = $value;
    }
    return $array;
  }

  function _haveMethod(string $method): bool {
    return method_exists($this, $method);
  }
}