<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Code Igniter
 *
 * An open source application development framework for PHP 4.3.2 or newer
 *
 * @package		CodeIgniter
 * @author		Rick Ellis
 * @copyright	Copyright (c) 2006, pMachine, Inc.
 * @license		http://www.codeignitor.com/user_guide/license.html 
 * @link		http://www.codeigniter.com
 * @since		Version 1.3
 * @filesource
 */
 
// ------------------------------------------------------------------------

/**
 * CI_BASE - For PHP 4
 * 
 * This file is used only when Code Igniter is being run under PHP 4.
 * 
 * In order to allow CI to work under PHP 4 we had to make the Loader class 
 * the parent of the Controller Base class.  It's the only way we enabled
 * enable functions like $this->load->library('email') to instantiate 
 * classes that can then be used within controllers as $this->email->send()
 *
 * PHP 4 also has trouble referencing the CI super object within application 
 * constructors since objects do not exist until the class is fully
 * instantiated.  Basically PHP 4 sucks...
 *
 * Since PHP 5 doesn't suffer from this problem so we load one of 
 * two files based on the version of PHP being run.
 * 
 * @package		CodeIgniter
 * @subpackage	codeigniter
 * @category	front-controller
 * @author		Rick Ellis
 * @link		http://www.codeigniter.com/user_guide/
 */
 class CI_Base extends CI_Loader {

	function CI_Base()
	{
		parent::CI_Loader();
		$this->load =& $this;
		
		global $OBJ;
		$OBJ = $this->load;
	}
}

function &get_instance()
{
	global $CI, $OBJ;
	
	if (is_object($CI)) 
	{
		return $CI;
	}
	
	return $OBJ->load;
}

?>