static void
   setstate (layer& l, boost::python::tuple state)
   {
        using namespace boost::python;
        if (len(state) != 8)
        {
         PyErr_SetObject(PyExc_ValueError,
                         ("expected 8-item tuple in call to __setstate__; got %s"
                          % state).ptr()
            );
         throw_error_already_set();
        }

        if (state[0])
        {
            l.set_abstract(extract<std::string>(state[0]));
        }

        if (state[1])
        {
            l.set_title(extract<std::string>(state[1]));
        }

        if (state[2])
        {
            l.set_clear_label_cache(extract<bool>(state[2]));
        }

        if (state[3])
        {
            l.setMinZoom(extract<double>(state[3]));
        }

        if (state[4])
        {
            l.setMaxZoom(extract<double>(state[4]));
        }

        if (state[5])
        {
            l.setQueryable(extract<bool>(state[5]));
        }

        if (state[6])
        {
            mapnik::parameters params = extract<parameters>(state[6]);
            l.set_datasource(datasource_cache::instance()->create(params));
        }
        
        boost::python::list s = extract<boost::python::list>(state[7]);
        for (int i=0;i<len(s);++i)
        {
           l.add_style(extract<std::string>(s[i]));
        }
   }