function buildXML($page_handle = NULL, $utilities = NULL, $indent = false, $caching = true)
 {
     $events = new XMLElement("events");
     $xml = new XMLElement("data");
     $xml->setIncludeHeader(true);
     $page_handle = $page_handle ? $page_handle : $this->_page;
     $sql = "SELECT t1.*,\n\t\t\t\t\t\t   t2.events as `master_events`,\n\t\t\t\t\t\t   t2.data_sources as `master_data_sources`\n\n\t\t\t\t\tFROM `tbl_pages` AS `t1`\n\t\t\t\t\tLEFT JOIN `tbl_masters` AS `t2` ON t1.`master` = concat(t2.`name`, '.xsl')\n\t\t\t\t\tWHERE t1.`handle` = '" . $page_handle . "' LIMIT 1";
     if (!($page = $this->_db->fetchRow(0, $sql))) {
         $this->fatalError("Requested page '" . $page_handle . "' could not be found");
     }
     $page_data = preg_split('/,/', $page['data_sources'] . "," . $page['master_data_sources'], -1, PREG_SPLIT_NO_EMPTY);
     $page_events = preg_split('/,/', $page['events'] . "," . $page['master_events'], -1, PREG_SPLIT_NO_EMPTY);
     $page_data = General::array_remove_duplicates($page_data);
     $page_events = General::array_remove_duplicates($page_events);
     ##EVENTS
     if (is_array($page_events) && !empty($page_events)) {
         foreach ($page_events as $e) {
             $this->_EventManager->addEvent($e);
         }
     }
     $this->_EventManager->fireEvents($events, array('parent' => $this, 'env' => $this->_env));
     $this->_EventManager->flush();
     $xml->addChild($events);
     $this->_events = $events;
     ##DATASOURCES
     $dsParam = array("indent-depth" => 1, "caching" => $caching, "indent" => $indent, "preview" => $this->_preview, "allow_optimise" => $page['optimise_xml'] == "yes" ? 'on' : 'off');
     if (is_array($page_data) && !empty($page_data)) {
         foreach ($page_data as $d) {
             $this->_DatasourceManager->addDatasource($d, $dsParam);
         }
     }
     $this->_DatasourceManager->renderData($xml, array('parent' => $this, 'env' => $this->_env));
     $this->_DatasourceManager->flush();
     ##Generate the final XML
     $this->_xml_final = $xml->generate($indent, 0);
     $doctor = new XMLRepair();
     $doctor->repair($this->_xml_final);
     unset($doctor);
     $this->_xml_final = trim($this->_xml_final);
     return $this->_xml_final;
 }