public function diffFiltered(Interval $ci, Closure $callback, Date $dt = null, $abs = true)
    {
        $start = $this;
        $end = $dt ?: static::now($this->getTimezone());
        $inverse = false;

        if ($end < $start) {
            $start = $end;
            $end = $this;
            $inverse = true;
        }

        $period = new DatePeriod($start, $ci, $end);
        $vals = array_filter(
            iterator_to_array($period),
            function (DateTimeInterface $date) use ($callback) {
                return call_user_func($callback, Date::instance($date));
            }
        );

        $diff = count($vals);

        return $inverse && !$abs ? -$diff : $diff;
    }