public function reportMissingAssetsIn($other, $type)
 {
     $this->checkSourceTargetSite();
     if ($other != c\T::SOURCE && $other != c\T::TARGET) {
         throw new e\CascadeInstancesErrorException(S_SPAN . "The instance {$other} is not acceptable. " . E_SPAN);
     }
     // figure out the class name of the asset and
     // container type and class name of container
     $asset_class = c\T::getClassNameByType($type);
     $asset_class = Asset::NAME_SPACE . "\\" . $asset_class;
     if (!isset($asset_class)) {
         throw new e\CascadeInstancesErrorException(S_SPAN . "The type {$type} is not acceptable. " . E_SPAN);
     }
     $parent_type = c\T::getParentType($type);
     $parent_class = c\T::getClassNameByType($parent_type);
     $parent_class = Asset::NAME_SPACE . "\\" . $parent_class;
     $base = $other == c\T::SOURCE ? c\T::TARGET : c\T::SOURCE;
     $base_cascade = $base . '_cascade';
     $base_site = $base . '_site';
     $other_cascade = $other . '_cascade';
     $other_site = $other . '_site';
     // traverse source/target base folder
     if ($parent_type == Folder::TYPE) {
         $at = $this->{$base_site}->getAssetTree();
     } else {
         if ($other == c\T::SOURCE) {
             $method = 'getRoot' . $parent_class . 'AssetTree';
             $at = $this->{$base_site}->{$method}();
         }
     }
     $results = array();
     $results[$type] = array();
     $at->traverse(array($asset_class::TYPE => array("CascadeInstances::assetTreeReportMissingAssetsIn")), array('base-cascade' => $this->{$base_cascade}, 'base-site' => $this->{$base_site}, 'other-cascade' => $this->{$other_cascade}, 'other-site' => $this->{$other_site}), $results);
     return $results;
 }