Класс для CURL

Встроенная библиотека curl, конечно же, замечательная, но пользоваться ей не всегда удобно, потому что надо писать кучу однотипных строчек.
Предлагаю свой класс для курла, он умеет следующее:
- поддерживается цепочка вызовов
- сразу заданы user-agent и accept (их можно изменить вот так Curl::$ua = '----'; )
- применен паттерн singleton, тоесть возможен только один объект в сценарии
- автоматически разжимает gzip/deflate, при этом запрашивает сжатые данные (это экономит трафик раз в 10)

<?php
echo Curl::init('http://ya.ru')
        ->referer('http://snippets.pp.ru')
        ->cookie('cookie.txt')
        ->exec();
 
class Curl {
 
    static $cookie;
    static $proxy;
    static $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.6.7 (.NET CLR 3.5.30729)';
    static $accept = array(
        'Accept' => 'application/xhtml+voice+xml;version=1.2, application/x-xhtml+voice+xml;version=1.2, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/JPEG,     image/gif, image/x-xbitmap, *\\/*;q=0.1',
        'Accept-Language' => 'ru, en',
        'Accept-Charset' => 'windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1',
        'Accept-Encoding' => 'gzip,deflate',
    );
    private $ch; //идентификатор соединения
    protected static $instance; //переменная для singleton
    private $info; //переменная для информации о соеденении
    private $file; //переменная для файла
 
    //функция для инициализации
    public static function init($url='') {
        return (self::$instance === null) ?
                self::$instance = new self($url) :
                self::$instance;
    }
 
    //конструктор
    function __construct($url) {
        $this->ch = curl_init();
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
        if ($url)
            $this->url($url);
        return self::$instance;
    }
 
    //деструктор, закрывает соединение
    function __destruct() {
        if (!is_null(self::$instance))
            $this->close();
    }
 
    //обертка для сохранения файла
    function file($save) {
        curl_setopt($this->ch, CURLOPT_FILE, $this->file = fopen($save, 'w+b'));
        return self::$instance;
    }
 
    //обертка для закрытия соединения
    function close() {
        curl_close($this->ch);
        if (!is_null($this->file)) {
            fclose($this->file);
            $this->file = null;
        }
        return self::$instance = null;
    }
 
    //обертка для задания url
    function url($url) {
        curl_setopt($this->ch, CURLOPT_URL, $url);
        return self::$instance;
    }
 
    //обертка для установки прокси
    function proxy($proxy) {
        curl_setopt($this->ch, CURLOPT_PROXY, $proxy);
        return self::$instance;
    }
 
    //обертка для установки редиректов
    function followlocation($followlocation) {
        curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, $followlocation);
        return self::$instance;
    }
 
    //обертка для установки кукис
    function cookie($cookie) {
        self::$cookie = $cookie;
        if ($cookie) {
            curl_setopt($this->ch, CURLOPT_COOKIEFILE, $cookie);
            curl_setopt($this->ch, CURLOPT_COOKIEJAR, $cookie);
        }
        return self::$instance;
    }
 
    //обертка для установки реферера
    function referer($referer) {
        curl_setopt($this->ch, CURLOPT_REFERER, $referer);
        return self::$instance;
    }
 
    //обертка для получения информации о соединении
    function get_info() {
        return $this->info;
    }
 
    //обертка для задания пост данных $post = array();
    function post($post) {
        $post = http_build_query($post, null, '&');
        curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post);
        return self::$instance;
    }
 
    //обертка для выполнения соединения
    function exec($close = true) {
        curl_setopt($this->ch, CURLOPT_USERAGENT, self::$ua);
        if (self::$cookie)
            $this->cookie(self::$cookie);
        if (self::$proxy)
            $this->proxy(self::$proxy);
 
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, self::$accept);
        $exec = curl_exec($this->ch);
        $this->info = curl_getinfo($this->ch);
 
        //закрываем соединение если задано
        if ($close)
            $this->close();
 
        return $this->extr($exec);
    }
 
    //функция разжимает gzip/deflate
    protected function extr($s) {
        return (substr($s, 0, 8) == "\x1F\x8B\x08\x00\x00\x00\x00\x00") ? gzinflate(substr($s, 10)) : $s;
    }
 
}
 
?>