Source for file legacy.php

Documentation is available at legacy.php

  1. <?php
  2. /**
  3.  * @package     Joomla.Legacy
  4.  * @subpackage  View
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE
  8.  */
  9.  
  10. defined('JPATH_PLATFORM'or die;
  11.  
  12. /**
  13.  * Base class for a Joomla View
  14.  *
  15.  * Class holding methods for displaying presentation data.
  16.  *
  17.  * @package     Joomla.Legacy
  18.  * @subpackage  View
  19.  * @since       12.2
  20.  */
  21. class JViewLegacy extends JObject
  22. {
  23.     /**
  24.      * The name of the view
  25.      *
  26.      * @var    array 
  27.      */
  28.     protected $_name = null;
  29.  
  30.     /**
  31.      * Registered models
  32.      *
  33.      * @var    array 
  34.      */
  35.     protected $_models = array();
  36.  
  37.     /**
  38.      * The base path of the view
  39.      *
  40.      * @var    string 
  41.      */
  42.     protected $_basePath = null;
  43.  
  44.     /**
  45.      * The default model
  46.      *
  47.      * @var    string 
  48.      */
  49.     protected $_defaultModel = null;
  50.  
  51.     /**
  52.      * Layout name
  53.      *
  54.      * @var    string 
  55.      */
  56.     protected $_layout = 'default';
  57.  
  58.     /**
  59.      * Layout extension
  60.      *
  61.      * @var    string 
  62.      */
  63.     protected $_layoutExt = 'php';
  64.  
  65.     /**
  66.      * Layout template
  67.      *
  68.      * @var    string 
  69.      */
  70.     protected $_layoutTemplate = '_';
  71.  
  72.     /**
  73.      * The set of search directories for resources (templates)
  74.      *
  75.      * @var array 
  76.      */
  77.     protected $_path = array('template' => array()'helper' => array());
  78.  
  79.     /**
  80.      * The name of the default template source file.
  81.      *
  82.      * @var string 
  83.      */
  84.     protected $_template = null;
  85.  
  86.     /**
  87.      * The output of the template script.
  88.      *
  89.      * @var string 
  90.      */
  91.     protected $_output = null;
  92.  
  93.     /**
  94.      * Callback for escaping.
  95.      *
  96.      * @var string 
  97.      * @deprecated 13.3
  98.      */
  99.     protected $_escape = 'htmlspecialchars';
  100.  
  101.     /**
  102.      * Charset to use in escaping mechanisms; defaults to urf8 (UTF-8)
  103.      *
  104.      * @var string 
  105.      */
  106.     protected $_charset = 'UTF-8';
  107.  
  108.     /**
  109.      * Constructor
  110.      *
  111.      * @param   array  $config  A named configuration array for object construction.<br/>
  112.      *                           name: the name (optional) of the view (defaults to the view class name suffix).<br/>
  113.      *                           charset: the character set to use for display<br/>
  114.      *                           escape: the name (optional) of the function to use for escaping strings<br/>
  115.      *                           base_path: the parent path (optional) of the views directory (defaults to the component folder)<br/>
  116.      *                           template_plath: the path (optional) of the layout directory (defaults to base_path + /views/ + view name<br/>
  117.      *                           helper_path: the path (optional) of the helper files (defaults to base_path + /helpers/)<br/>
  118.      *                           layout: the layout (optional) to use to display the view<br/>
  119.      *
  120.      * @since   12.2
  121.      */
  122.     public function __construct($config array())
  123.     {
  124.         // Set the view name
  125.         if (empty($this->_name))
  126.         {
  127.             if (array_key_exists('name'$config))
  128.             {
  129.                 $this->_name = $config['name'];
  130.             }
  131.             else
  132.             {
  133.                 $this->_name = $this->getName();
  134.             }
  135.         }
  136.  
  137.         // Set the charset (used by the variable escaping functions)
  138.         if (array_key_exists('charset'$config))
  139.         {
  140.             JLog::add('Setting a custom charset for escaping is deprecated. Override JViewLegacy::escape() instead.'JLog::WARNING'deprecated');
  141.             $this->_charset = $config['charset'];
  142.         }
  143.  
  144.         // User-defined escaping callback
  145.         if (array_key_exists('escape'$config))
  146.         {
  147.             $this->setEscape($config['escape']);
  148.         }
  149.  
  150.         // Set a base path for use by the view
  151.         if (array_key_exists('base_path'$config))
  152.         {
  153.             $this->_basePath = $config['base_path'];
  154.         }
  155.         else
  156.         {
  157.             $this->_basePath = JPATH_COMPONENT;
  158.         }
  159.  
  160.         // Set the default template search path
  161.         if (array_key_exists('template_path'$config))
  162.         {
  163.             // User-defined dirs
  164.             $this->_setPath('template'$config['template_path']);
  165.         }
  166.         elseif (is_dir(JPATH_COMPONENT '/view'))
  167.         {
  168.             $this->_setPath('template'$this->_basePath . '/view/' $this->getName('/tmpl');
  169.         }
  170.         else
  171.         {
  172.             $this->_setPath('template'$this->_basePath . '/views/' $this->getName('/tmpl');
  173.         }
  174.  
  175.         // Set the default helper search path
  176.         if (array_key_exists('helper_path'$config))
  177.         {
  178.             // User-defined dirs
  179.             $this->_setPath('helper'$config['helper_path']);
  180.         }
  181.         else
  182.         {
  183.             $this->_setPath('helper'$this->_basePath . '/helpers');
  184.         }
  185.  
  186.         // Set the layout
  187.         if (array_key_exists('layout'$config))
  188.         {
  189.             $this->setLayout($config['layout']);
  190.         }
  191.         else
  192.         {
  193.             $this->setLayout('default');
  194.         }
  195.  
  196.         $this->baseurl JUri::base(true);
  197.     }
  198.  
  199.     /**
  200.      * Execute and display a template script.
  201.      *
  202.      * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
  203.      *
  204.      * @return  mixed  A string if successful, otherwise a Error object.
  205.      *
  206.      * @see     JViewLegacy::loadTemplate()
  207.      * @since   12.2
  208.      */
  209.     public function display($tpl null)
  210.     {
  211.         $result $this->loadTemplate($tpl);
  212.         if ($result instanceof Exception)
  213.         {
  214.             return $result;
  215.         }
  216.  
  217.         echo $result;
  218.     }
  219.  
  220.     /**
  221.      * Assigns variables to the view script via differing strategies.
  222.      *
  223.      * This method is overloaded; you can assign all the properties of
  224.      * an object, an associative array, or a single value by name.
  225.      *
  226.      * You are not allowed to set variables that begin with an underscore;
  227.      * these are either private properties for JView or private variables
  228.      * within the template script itself.
  229.      *
  230.      * <code>
  231.      * $view = new JView;
  232.      *
  233.      * // Assign directly
  234.      * $view->var1 = 'something';
  235.      * $view->var2 = 'else';
  236.      *
  237.      * // Assign by name and value
  238.      * $view->assign('var1', 'something');
  239.      * $view->assign('var2', 'else');
  240.      *
  241.      * // Assign by assoc-array
  242.      * $ary = array('var1' => 'something', 'var2' => 'else');
  243.      * $view->assign($obj);
  244.      *
  245.      * // Assign by object
  246.      * $obj = new stdClass;
  247.      * $obj->var1 = 'something';
  248.      * $obj->var2 = 'else';
  249.      * $view->assign($obj);
  250.      *
  251.      * </code>
  252.      *
  253.      * @return  boolean  True on success, false on failure.
  254.      *
  255.      * @deprecated  13.3 Use native PHP syntax.
  256.      */
  257.     public function assign()
  258.     {
  259.         JLog::add(__METHOD__ . ' is deprecated. Use native PHP syntax.'JLog::WARNING'deprecated');
  260.  
  261.         // Get the arguments; there may be 1 or 2.
  262.         $arg0 @func_get_arg(0);
  263.         $arg1 @func_get_arg(1);
  264.  
  265.         // Assign by object
  266.         if (is_object($arg0))
  267.         {
  268.             // Assign public properties
  269.             foreach (get_object_vars($arg0as $key => $val)
  270.             {
  271.                 if (substr($key01!= '_')
  272.                 {
  273.                     $this->$key $val;
  274.                 }
  275.             }
  276.             return true;
  277.         }
  278.  
  279.         // Assign by associative array
  280.         if (is_array($arg0))
  281.         {
  282.             foreach ($arg0 as $key => $val)
  283.             {
  284.                 if (substr($key01!= '_')
  285.                 {
  286.                     $this->$key $val;
  287.                 }
  288.             }
  289.             return true;
  290.         }
  291.  
  292.         // Assign by string name and mixed value.
  293.  
  294.         // We use array_key_exists() instead of isset() because isset()
  295.         // fails if the value is set to null.
  296.         if (is_string($arg0&& substr($arg001!= '_' && func_num_args(1)
  297.         {
  298.             $this->$arg0 $arg1;
  299.             return true;
  300.         }
  301.  
  302.         // $arg0 was not object, array, or string.
  303.         return false;
  304.     }
  305.  
  306.     /**
  307.      * Assign variable for the view (by reference).
  308.      *
  309.      * You are not allowed to set variables that begin with an underscore;
  310.      * these are either private properties for JView or private variables
  311.      * within the template script itself.
  312.      *
  313.      * <code>
  314.      * $view = new JView;
  315.      *
  316.      * // Assign by name and value
  317.      * $view->assignRef('var1', $ref);
  318.      *
  319.      * // Assign directly
  320.      * $view->ref = &$var1;
  321.      * </code>
  322.      *
  323.      * @param   string  $key   The name for the reference in the view.
  324.      * @param   mixed   &$val  The referenced variable.
  325.      *
  326.      * @return  boolean  True on success, false on failure.
  327.      *
  328.      * @since   12.2
  329.      * @deprecated  13.3  Use native PHP syntax.
  330.      */
  331.     public function assignRef($key&$val)
  332.     {
  333.         JLog::add(__METHOD__ . ' is deprecated. Use native PHP syntax.'JLog::WARNING'deprecated');
  334.  
  335.         if (is_string($key&& substr($key01!= '_')
  336.         {
  337.             $this->$key &$val;
  338.             return true;
  339.         }
  340.  
  341.         return false;
  342.     }
  343.  
  344.     /**
  345.      * Escapes a value for output in a view script.
  346.      *
  347.      * If escaping mechanism is either htmlspecialchars or htmlentities, uses
  348.      * {@link $_encoding} setting.
  349.      *
  350.      * @param   mixed  $var  The output to escape.
  351.      *
  352.      * @return  mixed  The escaped value.
  353.      *
  354.      * @since   12.2
  355.      */
  356.     public function escape($var)
  357.     {
  358.         if (in_array($this->_escapearray('htmlspecialchars''htmlentities')))
  359.         {
  360.             return call_user_func($this->_escape$varENT_COMPAT$this->_charset);
  361.         }
  362.  
  363.         return call_user_func($this->_escape$var);
  364.     }
  365.  
  366.     /**
  367.      * Method to get data from a registered model or a property of the view
  368.      *
  369.      * @param   string  $property  The name of the method to call on the model or the property to get
  370.      * @param   string  $default   The name of the model to reference or the default value [optional]
  371.      *
  372.      * @return  mixed  The return value of the method
  373.      *
  374.      * @since   12.2
  375.      */
  376.     public function get($property$default null)
  377.     {
  378.         // If $model is null we use the default model
  379.         if (is_null($default))
  380.         {
  381.             $model $this->_defaultModel;
  382.         }
  383.         else
  384.         {
  385.             $model strtolower($default);
  386.         }
  387.  
  388.         // First check to make sure the model requested exists
  389.         if (isset($this->_models[$model]))
  390.         {
  391.             // Model exists, let's build the method name
  392.             $method 'get' ucfirst($property);
  393.  
  394.             // Does the method exist?
  395.             if (method_exists($this->_models[$model]$method))
  396.             {
  397.                 // The method exists, let's call it and return what we get
  398.                 $result $this->_models[$model]->$method();
  399.                 return $result;
  400.             }
  401.  
  402.         }
  403.  
  404.         // Degrade to JObject::get
  405.         $result parent::get($property$default);
  406.  
  407.         return $result;
  408.     }
  409.  
  410.     /**
  411.      * Method to get the model object
  412.      *
  413.      * @param   string  $name  The name of the model (optional)
  414.      *
  415.      * @return  mixed  JModelLegacy object
  416.      *
  417.      * @since   12.2
  418.      */
  419.     public function getModel($name null)
  420.     {
  421.         if ($name === null)
  422.         {
  423.             $name $this->_defaultModel;
  424.         }
  425.         return $this->_models[strtolower($name)];
  426.     }
  427.  
  428.     /**
  429.      * Get the layout.
  430.      *
  431.      * @return  string  The layout name
  432.      */
  433.     public function getLayout()
  434.     {
  435.         return $this->_layout;
  436.     }
  437.  
  438.     /**
  439.      * Get the layout template.
  440.      *
  441.      * @return  string  The layout template name
  442.      */
  443.     public function getLayoutTemplate()
  444.     {
  445.         return $this->_layoutTemplate;
  446.     }
  447.  
  448.     /**
  449.      * Method to get the view name
  450.      *
  451.      * The model name by default parsed using the classname, or it can be set
  452.      * by passing a $config['name'] in the class constructor
  453.      *
  454.      * @return  string  The name of the model
  455.      *
  456.      * @since   12.2
  457.      * @throws  Exception
  458.      */
  459.     public function getName()
  460.     {
  461.         if (empty($this->_name))
  462.         {
  463.             $classname get_class($this);
  464.             $viewpos strpos($classname'View');
  465.  
  466.             if ($viewpos === false)
  467.             {
  468.                 throw new Exception(JText::_('JLIB_APPLICATION_ERROR_VIEW_GET_NAME')500);
  469.             }
  470.  
  471.             $this->_name = strtolower(substr($classname$viewpos 4));
  472.         }
  473.  
  474.         return $this->_name;
  475.     }
  476.  
  477.     /**
  478.      * Method to add a model to the view.  We support a multiple model single
  479.      * view system by which models are referenced by classname.  A caveat to the
  480.      * classname referencing is that any classname prepended by JModel will be
  481.      * referenced by the name without JModel, eg. JModelCategory is just
  482.      * Category.
  483.      *
  484.      * @param   JModelLegacy  $model    The model to add to the view.
  485.      * @param   boolean       $default  Is this the default model?
  486.      *
  487.      * @return  object   The added model.
  488.      *
  489.      * @since   12.2
  490.      */
  491.     public function setModel($model$default false)
  492.     {
  493.         $name strtolower($model->getName());
  494.         $this->_models[$name$model;
  495.  
  496.         if ($default)
  497.         {
  498.             $this->_defaultModel = $name;
  499.         }
  500.         return $model;
  501.     }
  502.  
  503.     /**
  504.      * Sets the layout name to use
  505.      *
  506.      * @param   string  $layout  The layout name or a string in format <template>:<layout file>
  507.      *
  508.      * @return  string  Previous value.
  509.      *
  510.      * @since   12.2
  511.      */
  512.     public function setLayout($layout)
  513.     {
  514.         $previous $this->_layout;
  515.         if (strpos($layout':'=== false)
  516.         {
  517.             $this->_layout = $layout;
  518.         }
  519.         else
  520.         {
  521.             // Convert parameter to array based on :
  522.             $temp explode(':'$layout);
  523.             $this->_layout = $temp[1];
  524.  
  525.             // Set layout template
  526.             $this->_layoutTemplate = $temp[0];
  527.         }
  528.  
  529.         return $previous;
  530.     }
  531.  
  532.     /**
  533.      * Allows a different extension for the layout files to be used
  534.      *
  535.      * @param   string  $value  The extension.
  536.      *
  537.      * @return  string   Previous value
  538.      *
  539.      * @since   12.2
  540.      */
  541.     public function setLayoutExt($value)
  542.     {
  543.         $previous $this->_layoutExt;
  544.         if ($value preg_replace('#[^A-Za-z0-9]#'''trim($value)))
  545.         {
  546.             $this->_layoutExt = $value;
  547.         }
  548.  
  549.         return $previous;
  550.     }
  551.  
  552.     /**
  553.      * Sets the _escape() callback.
  554.      *
  555.      * @param   mixed  $spec  The callback for _escape() to use.
  556.      *
  557.      * @return  void 
  558.      *
  559.      * @since   12.2
  560.      * @deprecated  13.3  Override JViewLegacy::escape() instead.
  561.      */
  562.     public function setEscape($spec)
  563.     {
  564.         JLog::add(__METHOD__ . ' is deprecated. Override JViewLegacy::escape() instead.'JLog::WARNING'deprecated');
  565.  
  566.         $this->_escape = $spec;
  567.     }
  568.  
  569.     /**
  570.      * Adds to the stack of view script paths in LIFO order.
  571.      *
  572.      * @param   mixed  $path  A directory path or an array of paths.
  573.      *
  574.      * @return  void 
  575.      *
  576.      * @since   12.2
  577.      */
  578.     public function addTemplatePath($path)
  579.     {
  580.         $this->_addPath('template'$path);
  581.     }
  582.  
  583.     /**
  584.      * Adds to the stack of helper script paths in LIFO order.
  585.      *
  586.      * @param   mixed  $path  A directory path or an array of paths.
  587.      *
  588.      * @return  void 
  589.      *
  590.      * @since   12.2
  591.      */
  592.     public function addHelperPath($path)
  593.     {
  594.         $this->_addPath('helper'$path);
  595.     }
  596.  
  597.     /**
  598.      * Load a template file -- first look in the templates folder for an override
  599.      *
  600.      * @param   string  $tpl  The name of the template source file; automatically searches the template paths and compiles as needed.
  601.      *
  602.      * @return  string  The output of the the template script.
  603.      *
  604.      * @since   12.2
  605.      * @throws  Exception
  606.      */
  607.     public function loadTemplate($tpl null)
  608.     {
  609.         // Clear prior output
  610.         $this->_output = null;
  611.  
  612.         $template JFactory::getApplication()->getTemplate();
  613.         $layout $this->getLayout();
  614.         $layoutTemplate $this->getLayoutTemplate();
  615.  
  616.         // Create the template file name based on the layout
  617.         $file = isset($tpl$layout '_' $tpl $layout;
  618.  
  619.         // Clean the file name
  620.         $file preg_replace('/[^A-Z0-9_\.-]/i'''$file);
  621.         $tpl = isset($tplpreg_replace('/[^A-Z0-9_\.-]/i'''$tpl$tpl;
  622.  
  623.         // Load the language file for the template
  624.         $lang JFactory::getLanguage();
  625.         $lang->load('tpl_' $templateJPATH_BASEnullfalsetrue)
  626.             || $lang->load('tpl_' $templateJPATH_THEMES "/$template"nullfalsetrue);
  627.  
  628.         // Change the template folder if alternative layout is in different template
  629.         if (isset($layoutTemplate&& $layoutTemplate != '_' && $layoutTemplate != $template)
  630.         {
  631.             $this->_path['template'str_replace($template$layoutTemplate$this->_path['template']);
  632.         }
  633.  
  634.         // Load the template script
  635.         jimport('joomla.filesystem.path');
  636.         $filetofind $this->_createFileName('template'array('name' => $file));
  637.         $this->_template = JPath::find($this->_path['template']$filetofind);
  638.  
  639.         // If alternate layout can't be found, fall back to default layout
  640.         if ($this->_template == false)
  641.         {
  642.             $filetofind $this->_createFileName(''array('name' => 'default' (isset($tpl'_' $tpl $tpl)));
  643.             $this->_template = JPath::find($this->_path['template']$filetofind);
  644.         }
  645.  
  646.         if ($this->_template != false)
  647.         {
  648.             // Unset so as not to introduce into template scope
  649.             unset($tpl);
  650.             unset($file);
  651.  
  652.             // Never allow a 'this' property
  653.             if (isset($this->this))
  654.             {
  655.                 unset($this->this);
  656.             }
  657.  
  658.             // Start capturing output into a buffer
  659.             ob_start();
  660.  
  661.             // Include the requested template filename in the local scope
  662.             // (this will execute the view logic).
  663.             include $this->_template;
  664.  
  665.             // Done with the requested template; get the buffer and
  666.             // clear it.
  667.             $this->_output = ob_get_contents();
  668.             ob_end_clean();
  669.  
  670.             return $this->_output;
  671.         }
  672.         else
  673.         {
  674.             throw new Exception(JText::sprintf('JLIB_APPLICATION_ERROR_LAYOUTFILE_NOT_FOUND'$file)500);
  675.         }
  676.     }
  677.  
  678.     /**
  679.      * Load a helper file
  680.      *
  681.      * @param   string  $hlp  The name of the helper source file automatically searches the helper paths and compiles as needed.
  682.      *
  683.      * @return  void 
  684.      *
  685.      * @since   12.2
  686.      */
  687.     public function loadHelper($hlp null)
  688.     {
  689.         // Clean the file name
  690.         $file preg_replace('/[^A-Z0-9_\.-]/i'''$hlp);
  691.  
  692.         // Load the template script
  693.         jimport('joomla.filesystem.path');
  694.         $helper JPath::find($this->_path['helper']$this->_createFileName('helper'array('name' => $file)));
  695.  
  696.         if ($helper != false)
  697.         {
  698.             // Include the requested template filename in the local scope
  699.             include_once $helper;
  700.         }
  701.     }
  702.  
  703.     /**
  704.      * Sets an entire array of search paths for templates or resources.
  705.      *
  706.      * @param   string  $type  The type of path to set, typically 'template'.
  707.      * @param   mixed   $path  The new search path, or an array of search paths.  If null or false, resets to the current directory only.
  708.      *
  709.      * @return  void 
  710.      *
  711.      * @since   12.2
  712.      */
  713.     protected function _setPath($type$path)
  714.     {
  715.         $component JApplicationHelper::getComponentName();
  716.         $app JFactory::getApplication();
  717.  
  718.         // Clear out the prior search dirs
  719.         $this->_path[$typearray();
  720.  
  721.         // Actually add the user-specified directories
  722.         $this->_addPath($type$path);
  723.  
  724.         // Always add the fallback directories as last resort
  725.         switch (strtolower($type))
  726.         {
  727.             case 'template':
  728.                 // Set the alternative template search dir
  729.                 if (isset($app))
  730.                 {
  731.                     $component preg_replace('/[^A-Z0-9_\.-]/i'''$component);
  732.                     $fallback JPATH_THEMES '/' $app->getTemplate('/html/' $component '/' $this->getName();
  733.                     $this->_addPath('template'$fallback);
  734.                 }
  735.                 break;
  736.         }
  737.     }
  738.  
  739.     /**
  740.      * Adds to the search path for templates and resources.
  741.      *
  742.      * @param   string  $type  The type of path to add.
  743.      * @param   mixed   $path  The directory or stream, or an array of either, to search.
  744.      *
  745.      * @return  void 
  746.      *
  747.      * @since   12.2
  748.      */
  749.     protected function _addPath($type$path)
  750.     {
  751.         // Just force to array
  752.         settype($path'array');
  753.  
  754.         // Loop through the path directories
  755.         foreach ($path as $dir)
  756.         {
  757.             // No surrounding spaces allowed!
  758.             $dir trim($dir);
  759.  
  760.             // Add trailing separators as needed
  761.             if (substr($dir-1!= DIRECTORY_SEPARATOR)
  762.             {
  763.                 // Directory
  764.                 $dir .= DIRECTORY_SEPARATOR;
  765.             }
  766.  
  767.             // Add to the top of the search dirs
  768.             array_unshift($this->_path[$type]$dir);
  769.         }
  770.     }
  771.  
  772.     /**
  773.      * Create the filename for a resource
  774.      *
  775.      * @param   string  $type   The resource type to create the filename for
  776.      * @param   array   $parts  An associative array of filename information
  777.      *
  778.      * @return  string  The filename
  779.      *
  780.      * @since   12.2
  781.      */
  782.     protected function _createFileName($type$parts array())
  783.     {
  784.         switch ($type)
  785.         {
  786.             case 'template':
  787.                 $filename strtolower($parts['name']'.' $this->_layoutExt;
  788.                 break;
  789.  
  790.             default:
  791.                 $filename strtolower($parts['name']'.php';
  792.                 break;
  793.         }
  794.         return $filename;
  795.     }
  796.  
  797.     /**
  798.      * Returns the form object
  799.      *
  800.      * @return  mixed  A JForm object on success, false on failure
  801.      *
  802.      * @since   3.2
  803.      */
  804.     public function getForm()
  805.     {
  806.         if (!is_object($this->form))
  807.         {
  808.             $this->form $this->get('Form');
  809.         }
  810.         return $this->form;
  811.     }
  812. }

Documentation generated on Tue, 19 Nov 2013 15:06:51 +0100 by phpDocumentor 1.4.3