public function Intersect(DBSearch $oFilter)
 {
     if ($oFilter instanceof DBUnionSearch) {
         // Develop!
         $aFilters = $oFilter->GetSearches();
     } else {
         $aFilters = array($oFilter);
     }
     $aSearches = array();
     foreach ($aFilters as $oRightFilter) {
         $oLeftFilter = $this->DeepClone();
         $oRightFilter = $oRightFilter->DeepClone();
         if ($oLeftFilter->GetClass() != $oRightFilter->GetClass()) {
             if (MetaModel::IsParentClass($oLeftFilter->GetClass(), $oRightFilter->GetClass())) {
                 // Specialize $oLeftFilter
                 $oLeftFilter->ChangeClass($oRightFilter->GetClass());
             } elseif (MetaModel::IsParentClass($oRightFilter->GetClass(), $oLeftFilter->GetClass())) {
                 // Specialize $oRightFilter
                 $oRightFilter->ChangeClass($oLeftFilter->GetClass());
             } else {
                 throw new CoreException("Attempting to merge a filter of class '{$oLeftFilter->GetClass()}' with a filter of class '{$oRightFilter->GetClass()}'");
             }
         }
         $aAliasTranslation = array();
         $oLeftFilter->MergeWith_InNamespace($oRightFilter, $oLeftFilter->m_aClasses, $aAliasTranslation);
         $oLeftFilter->TransferConditionExpression($oRightFilter, $aAliasTranslation);
         $aSearches[] = $oLeftFilter;
     }
     if (count($aSearches) == 1) {
         // return a DBObjectSearch
         return $aSearches[0];
     } else {
         return new DBUnionSearch($aSearches);
     }
 }