<?php

/*
  Session class, by linblow@hotmail.fr (on php.net)
  
  // We get the instance
  $data = Session::getInstance();

  // Let's store datas in the session
  $data->nickname = 'Someone';
  $data->age = 18;
  
  // TRUE
  var_dump( isset( $data->nickname ));
*/

class Session
{
    const SESSION_STARTED = TRUE;
    const SESSION_NOT_STARTED = FALSE;
    
    // the state of the session
    private $sessionState = self::SESSION_NOT_STARTED;
    
    // THE only instance of the class
    private static $instance;
    
    private function __construct() {}
    
    /**
     *    Returns THE instance of 'Session'.
     *    The session is automatically initialized if it wasn't.
     *    
     *    @return    object
     **/
    public static function getInstance()
    {
      if ( !isset(self::$instance))
      {
        self::$instance = new self;
      }
      
      self::$instance->startSession();
      
      return self::$instance;
    }
    
    /**
     *    (Re)starts the session.
     *    
     *    @return    bool    TRUE if the session has been initialized, else FALSE.
     **/
    public function startSession()
    {
      if ( $this->sessionState == self::SESSION_NOT_STARTED )
      {
        $this->sessionState = session_start();
      }
      
      return $this->sessionState;
    }
    
    /**
     *    Stores datas in the session.
     *    Example: $instance->foo = 'bar';
     *    
     *    @param    name    Name of the datas.
     *    @param    value    Your datas.
     *    @return    void
     **/
    public function __set( $name , $value )
    {
      $_SESSION[$name] = $value;
    }
    
    /**
     *    Gets datas from the session.
     *    Example: echo $instance->foo;
     *    
     *    @param    name    Name of the datas to get.
     *    @return    mixed    Datas stored in session.
     **/
    public function __get( $name )
    {
      if ( isset($_SESSION[$name]))
      {
        return $_SESSION[$name];
      }
    }
    
    public function __isset( $name )
    {
      return isset($_SESSION[$name]);
    }
    
    public function __unset( $name )
    {
      unset( $_SESSION[$name] );
    }
    
    /**
     *    Destroys the current session.
     **/
    public function destroy()
    {
      if ( $this->sessionState == self::SESSION_STARTED )
      {
        session_unset(); 
        session_destroy();
        
        $this->sessionState = self::SESSION_NOT_STARTED;
      }
    }
}

