// ------------------------------------------
		int DrawOperationBinder::setPClipRect(PyObject *self, PyObject *value, void *closure) {
			__PYTHON_EXCEPTION_GUARD_BEGIN_;

			DrawOperation* o = NULL;

			if (!python_cast<DrawOperation*>(self, &msType, &o, msCastInfo))
				__PY_CONVERR_RET_VAL(-1);

			if (value == NULL) {
				PyErr_SetString(PyExc_TypeError, "Cannot delete the attribute");
				return -1;
			}

			ClipRect rect;
			if (!TypeInfo<ClipRect>::fromPyObject(value, rect)) {
				PyErr_SetString(PyExc_TypeError, "Expected a 4 integer tuple(left,right,top,bottom)!");
				return -1;
			};

			o->setClipRect(rect);

			return 0;


			__PYTHON_EXCEPTION_GUARD_END_RVAL(-1);
		}
		// ------------------------------------------
		int DrawOperationBinder::setPPosition(PyObject *self, PyObject *value, void *closure) {
			__PYTHON_EXCEPTION_GUARD_BEGIN_;

			DrawOperation* o = NULL;

			assert(self != NULL);

			if (!python_cast<DrawOperation*>(self, &msType, &o, msCastInfo))
				__PY_CONVERR_RET_VAL(-1);

			assert(o != NULL);

			if (value == NULL) {
				PyErr_SetString(PyExc_TypeError, "Cannot delete the attribute");
				return -1;
			}

			// okay, we can proceed with the setting now


			PixelCoord pc;

			if (TypeInfo<PixelCoord>::fromPyObject(value, pc)) {
				o->setPosition(pc);

				return 0;
			} else {
				// Invalid parameters
				PyErr_SetString(PyExc_TypeError, "Expected a two integer tuple!");
				return -1;
			}

			__PYTHON_EXCEPTION_GUARD_END_RVAL(-1);
		}
		// ------------------------------------------
		int DrawOperationBinder::setPZOrder(PyObject *self, PyObject *value, void *closure) {
			__PYTHON_EXCEPTION_GUARD_BEGIN_;

			DrawOperation* o = NULL;

			if (!python_cast<DrawOperation*>(self, &msType, &o, msCastInfo))
				__PY_CONVERR_RET_VAL(-1);


			if (value == NULL) {
				PyErr_SetString(PyExc_TypeError, "Cannot delete the attribute");
				return -1;
			}

			int z;

			if (PyArg_ParseTuple(value, "i", &z)) {
				o->setZOrder(z);

				return 0;
			} else {
				// Invalid parameters
				PyErr_SetString(PyExc_TypeError, "Expected an integer argument!");
				return -1;
			}

			__PYTHON_EXCEPTION_GUARD_END_RVAL(-1);
		}
// ------------------------------------------
PyObject *LinkServiceBinder::getRelation(PyObject *self, PyObject *args) {
    __PYTHON_EXCEPTION_GUARD_BEGIN_;
    PyObject *result = NULL;
    LinkServicePtr o;

    if (!python_cast<LinkServicePtr>(self, &msType, &o))
        __PY_CONVERR_RET;

    PyObject *object;
    if (!PyArg_ParseTuple(args, "O", &object)) {
        PyErr_SetString(PyExc_TypeError,
                        "Expected an integer or string argument!");
        return NULL;
    }

    // two possibilities here : name or flavor
#ifdef IS_PY3K
    if (PyBytes_Check(object)) {
        char *str = PyBytes_AsString(object);
#else
    if (PyString_Check(object)) {
        char *str = PyString_AsString(object);
#endif
        RelationPtr rel = o->getRelation(str);

        if (!rel) {
            PyErr_Format(PyExc_ValueError, "Relation not found by name %s",
                         str);
        } else
            result = RelationBinder::create(rel);

        return result;
    } else if (PyLong_Check(object)) {
        long id = PyLong_AsLong(object);
        RelationPtr rel = o->getRelation(static_cast<int>(id));

        if (!rel) {
            PyErr_Format(PyExc_ValueError, "Relation not found by id %ld", id);
        } else
            result = RelationBinder::create(rel);

        return result;
    } else {
        // Invalid parameters
        PyErr_SetString(PyExc_TypeError,
                        "Expected an integer or string argument!");
        return NULL;
    }
    __PYTHON_EXCEPTION_GUARD_END_;
}

// ------------------------------------------
PyObject *LinkServiceBinder::getAllLinks(PyObject *self, PyObject *args) {
    __PYTHON_EXCEPTION_GUARD_BEGIN_;
    LinkServicePtr o;

    if (!python_cast<LinkServicePtr>(self, &msType, &o))
        __PY_CONVERR_RET;

    int flavor = 0, src, dst;
    PyObject *objflav;

    // let the third parameter be either string or integer
    // if it's a string, we first have to parse the string to get flavor id

    if (PyArg_ParseTuple(args, "Oii", &objflav, &src, &dst)) {
#ifdef IS_PY3K
        if (PyBytes_Check(objflav)) {
            char *str = PyBytes_AsString(objflav);
#else
        if (PyString_Check(objflav)) {
            char *str = PyString_AsString(objflav);
#endif
            flavor = o->nameToFlavor(str);
        } else if (PyLong_Check(objflav)) {
            flavor = PyLong_AsLong(objflav);
        } else {
            PyErr_SetString(
                PyExc_TypeError,
                "Invalid type given for flavor: expected string or integer");
            return NULL;
        }

        LinkQueryResultPtr res = o->getAllLinks(flavor, src, dst);

        return LinkQueryResultBinder::create(res);
    } else {
        // Invalid parameters
        PyErr_SetString(PyExc_TypeError,
                        "Expected three parameters: flavor, src and dst!");
        return NULL;
    }
    __PYTHON_EXCEPTION_GUARD_END_;
}

// ------------------------------------------
bool LinkServiceBinder::getFlavor(PyObject *src, LinkServicePtr &obj,
                                  int &flavor) {
    __PYTHON_EXCEPTION_GUARD_BEGIN_;
#ifdef IS_PY3K
    if (PyBytes_Check(src)) {
        char *str = PyBytes_AsString(src);
#else
    if (PyString_Check(src)) {
        char *str = PyString_AsString(src);
#endif
        flavor = obj->nameToFlavor(str);
        return true;
    } else if (PyLong_Check(src)) {
        flavor = PyLong_AsLong(src);
        return true;
    } else {
        PyErr_SetString(
            PyExc_TypeError,
            "Invalid type given for flavor: expected string or integer");
        return false;
    }
    __PYTHON_EXCEPTION_GUARD_END_RVAL(false);
}

// ------------------------------------------
PyObject *LinkServiceBinder::getAllInherited(PyObject *self, PyObject *args) {
    __PYTHON_EXCEPTION_GUARD_BEGIN_;
    LinkServicePtr o;

    if (!python_cast<LinkServicePtr>(self, &msType, &o))
        __PY_CONVERR_RET;

    int flavor = 0, src, dst;
    PyObject *objflav;

    // let the third parameter be either string or integer
    // if it's a string, we first have to parse the string to get flavor id

    if (PyArg_ParseTuple(args, "Oii", &objflav, &src, &dst)) {
        if (!getFlavor(objflav, o, flavor))
            return NULL;

        LinkQueryResultPtr res = o->getAllInherited(flavor, src, dst);

        return LinkQueryResultBinder::create(res);
    } else {
        // Invalid parameters
        PyErr_SetString(PyExc_TypeError,
                        "Expected three parameters: flavor, src and dst!");
        return NULL;
    }
    __PYTHON_EXCEPTION_GUARD_END_;
}