public function parse_string($template, $data = array(), $return = FALSE, $options = array())
 {
     if (!is_array($options)) {
         $options = array();
     }
     $options = array_merge($this->config, $options);
     $options['cumulative_noparse'] = !empty($options['cumulative_noparse']);
     if (is_object($data)) {
         $data = get_object_vars($data);
     }
     if (!is_array($data)) {
         if (empty($data)) {
             $data = array();
         } else {
             $data = (array) $data;
         }
     }
     $ci = $this->ci;
     $is_mx = false;
     if (!$return) {
         list($ci, $is_mx) = $this->detect_mx();
     }
     $parser = new Parser_Lex_Extensions();
     $parser->scopeGlue($options['scope_glue']);
     $parser->cumulativeNoparse($options['cumulative_noparse']);
     $data = array_merge($data, $ci->load->_ci_cached_vars);
     $parser->parser_options = $options;
     $template = $parser->parse($template, $data, array($parser, 'parser_callback'), $options['allow_php']);
     if ($options['cumulative_noparse']) {
         $template = Parser_Lex_Extensions::injectNoparse($template);
     }
     return $this->output($template, $return, $ci, $is_mx);
 }