<?php

/**
 * Sklad dat
 *
 * @author Milan Lempera
 * @package Classes
 * @copyright Web-systems.cz  2009
 *
 */

Class Registry {

  /**
   * pole proměnných
   * @var array
   */
  private $vars = array();

  /**
   * pole perzisntních proměnných
   * @var array
   */
  public $persistent = array();

  /**
   * instance obkjektu
   * @var object
   */
  private static $instance;

  private function __construct() {

  }

  /**
   * vrací instanci registrů
   * @return object
   */
  public function getInstance() {
    if ( is_object(self::$instance) == false ) {
      self::$instance = new Registry();
    }
    return self::$instance;
  }

  /**
   * magická metoda set
   * @param $key
   * @param $var
   * @return bool
   */
  public function __set($key, $var = '') {
    return $this->add($key, $var);
  }

  /**
   * magická metoda get
   * @param $key
   * @return value
   */
  public function __get($key) {
    if ( isset($this->vars[$key] ) == false) {
      return null;
    }
    return $this->vars[$key];
  }

  /**
   * přidá proměnnou do registru
   * @param $key
   * @param $value
   * @param $persistent
   * @return bool
   */
  public function add($key, $value, $persistent = false) {
    if ( $persistent == true ) {
      return $this->addPersistent($key, $value);
    }
    else {
      $this->vars[$key] = $value;
      return true;
    }
  }

  /**
   * přidá perzistentní proměnnou do registru
   * @param $key
   * @param $value
   * @return bool
   */
  public function addPersistent($key, $value, $n = 9) {
    $this->vars[$key] = $value;
    $this->persistent[$key] = $n;
    return true;
  }



  /**
   * nastaví existující proměnou v registru jako perzistentní
   * @param $key
   * @return unknown_type
   */
  public function setPersistent($key, $n = 9){
    if ( !isset($this->vars[$key] ) == false) {
      return false;
    }
    $this->persistent[$key] = $n;
  }

  /**
   * převede perzistetní proměnnou v registru na neperzistentní
   * @param $key
   * @return bool
   */
  public function unsetPersistent($key) {
    if ( !isset($this->persistent[$key] ) == false) {
      return false;
    }
    unset($this->persistent[$key]);
    return true;
  }

  /**
   * odstraní proměnnou z registru (ať je či není perzistentní)
   * @param $key
   * @return bool
   */
  public function remove($key) {
    unset($this->vars[$key]);
    if ( isset($this->persistent[$key] ) == true) {
      unset($this->persistent[$key]);
    }
    return true;
  }

  /*
   * ladící výpis registru
   */
  public function printAll() {
    Tools::getVar($this->vars,$this->persistent);
  }
  
  public function showVar($key) {
    $t = self::$instance;
    Tools::getVar(@$t->vars[$key],@$t->persistent[$key]);
  }

  public function deleteDiff() {
    $vars = array();
    $persistent = array();
    if (count($this->persistent) > 0) {
      foreach ($this->persistent as $key=>$value) {
        if ($value < 9) {
          $value--;
        }
        if ($value >= 0) {
          $persistent[$key] = $value;
          $vars[$key] = $this->vars[$key];
        }
      }
      $this->persistent = $persistent;
      $this->vars = $vars;
    }
    else {
      $this->persistent = array();
      $this->vars = array();
    }
  }

  function __sleep() {
  	@$this->message = $this->message.(!empty($this->to_message) ? '<br />'.$this->to_message : $this->to_message);
    $this->deleteDiff();
    //vytvoříme pole vlastností objektu
    $vlastnosti = get_object_vars($this);
    foreach ($vlastnosti as $klic => $hodnota) {
      $pole[] = $klic;
    }
    return $pole;
  }

  function __wakeup() {
    self::$instance = $this;
    Debug::addPoint( __CLASS__.' - '.__METHOD__, $this);
  }

  function __isset($key) {
    return array_key_exists($key, $this->vars);
  }
  
  function __unset($key) {
    unset($this->vars[$key]);
    unset($this->persistent[$key]);
  }

  public function __destruct() {
    $_SESSION['registry'] = serialize($this);
  }

}
?>