private function buildIterator($path)
{
$iterator = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS);
if ($this->exclude) {
$iterator = new \RecursiveCallbackFilterIterator($iterator, function ($foo, $bar, RecursiveDirectoryIterator $file) {
if (!$file->isDot() && !$file->isFile()) {
foreach ($this->exclude as $filter) {
if (!call_user_func($filter, $file)) {
return FALSE;
}
}
}
return TRUE;
});
}
if ($this->maxDepth !== 0) {
$iterator = new RecursiveIteratorIterator($iterator, $this->order);
$iterator->setMaxDepth($this->maxDepth);
}
$iterator = new \CallbackFilterIterator($iterator, function ($foo, $bar, \Iterator $file) {
while ($file instanceof \OuterIterator) {
$file = $file->getInnerIterator();
}
foreach ($this->groups as $filters) {
foreach ($filters as $filter) {
if (!call_user_func($filter, $file)) {
continue 2;
}
}
return TRUE;
}
return FALSE;
});
return $iterator;
}