def modify_contact(self, contact_id, attrs=None, members=None, tags=None):
        """
        :param contact_id: zimbra id of the targetd contact
        :param attrs  : a dictionary of attributes to set ({key:value,...})
        :param members: list of dict representing contacts and
        operation (+|-|reset)
        :param tags:    comma-separated list of tag names
        :returns:       the modified zobjects.Contact
        """
        cn = {}
        if tags:
            tags = self._return_comma_list(tags)
            cn['tn'] = tags
        if members:
            cn['m'] = members
        if attrs:
            attrs = [{'n': k, '_content': v} for k, v in attrs.items()]
            cn['a'] = attrs

        cn['id'] = contact_id
        resp = self.request_single('ModifyContact', {'cn': cn})

        return zobjects.Contact.from_dict(resp)