public function find($tag = null, $target = TimePoint::TARGET_ALL, $type = TimePoint::TYPE_ALL)
    {
        // the tag criteria can be omitted
        $tags = null;
        if (isset($tag)) {
            $tags = is_array($tag) ? $tag : [$tag];
        }
        
        // gather filterer TimePoint
        $points = [];
        foreach ($this->points as $point) {
            if ($point->match($tags, $target, $type)) {
                $points [] = $point;
            }
        }
        return $points;
    }