protected function sendStartHeaders()
    {
        // send optional cache limiter
        // this is actual session behavior rather than what's documented.
        $lastModified = self::formatAsGmt(filemtime($_SERVER['SCRIPT_FILENAME']));

        $ce = $this->cache_expire;
        switch ($this->cache_limiter) {
            case self::CACHE_LIMITER_PUBLIC:
                header('Expires: ' . self::formatAsGmt(time() + $ce));
                header("Cache-Control: public, max-age=$ce");
                header('Last-Modified: ' . $lastModified);
                break;
            case self::CACHE_LIMITER_PRIVATE_NO_EXPIRE:
                header("Cache-Control: private, max-age=$ce, pre-check=$ce");
                header('Last-Modified: ' . $lastModified);
                break;
            case self::CACHE_LIMITER_PRIVATE:
                header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
                header("Cache-Control: private, max-age=$ce, pre-check=$ce");
                header('Last-Modified: ' . $lastModified);
                break;
            case self::CACHE_LIMITER_NOCACHE:
                header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
                header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
                header('Pragma: no-cache');
                break;
            case self::CACHE_LIMITER_NONE:
                // send no cache headers, please
                break;
        }
    }