public static function findRecursive( $sourceDir, array $includeFilters = array(), array $excludeFilters = array(), eZAutoloadGenerator $gen )
    {
        $gen->log( "Scanning for PHP-files." );
        $gen->startProgressOutput( self::OUTPUT_PROGRESS_PHASE1 );

        // create the context, and then start walking over the array
        $context = new ezpAutoloadFileFindContext();
        $context->generator = $gen;

        self::walkRecursive( $sourceDir, $includeFilters, $excludeFilters,
                array( 'eZAutoloadGenerator', 'findRecursiveCallback' ), $context );

        // return the found and pattern-matched files
        sort( $context->elements );

        $gen->stopProgressOutput( self::OUTPUT_PROGRESS_PHASE1 );
        $gen->log( "Scan complete. Found {$context->count} PHP files." );

        return $context->elements;
    }