public function slowFlick(array $elementRef = null, $x, $y, $direction, $distance)
    {
        // Step size is empiric, it probably can depend on screen resolution or size.
        $stepSize = 30;
        $stepCount = (int) ($distance - $distance % $stepSize) / $stepSize;
        $this
            ->down($elementRef, $x, $y);
        list($xMultiplier, $yMultiplier) = $this->getDirectionMultipliers($direction);
        // Moving by small steps with zero pauses.
        for ($i = 1; $i <= $stepCount; $i++) {
            $offset = $stepSize * $i;
            $this
                ->move($elementRef, $x + $offset * $xMultiplier, $y + $offset * $yMultiplier)
                ->pause();
        }
        // Pause lengths before and after final step are empiric, too.
        $this
            ->pause(100)
            ->move($elementRef, $x + $distance * $xMultiplier, $y + $distance * $yMultiplier)
            ->pause(100)
            ->up();
        // Precision of scrolling is not perfect, errors of several pixels are possible.
        return $this;
    }