def getMemberData(self, start=0, batch=4000, exclude_props=None, include_props=None):

    import csv
    from cStringIO import StringIO
    from DateTime import DateTime
    from Products.qMemberdataExport import getRegisteredMemberdataHandlers as registry
    from Products.qMemberdataExport.config import EXCLUDE_PROPS, CLEAR_CACHE_COUNTER

    if exclude_props is None: exclude_props = EXCLUDE_PROPS

    memberdatahandler = False

    for handler in registry():
        try:
            memberdatahandler = handler(self)
            break
        except:
            pass

    if not memberdatahandler: return None

    members = memberdatahandler.getAllMembers()

    if batch > len(members) - start: batch = len(members) - start

    members_list = []
    counter = 0

    for member in members[start:start+batch]:
        if counter % CLEAR_CACHE_COUNTER == 0: 
            self._p_jar.sync()
        members_list.append(memberdatahandler.getMemberProperties(member, exclude_props, include_props))
        counter += 1
        print "Processed %d members. Current member id: %s" % (counter, str(member))

    res = StringIO()
    writer = csv.DictWriter(res, fieldnames = memberdatahandler.fieldnames, extrasaction='ignore', quoting=csv.QUOTE_ALL)

    # writing header row
    writer.writer.writerow(memberdatahandler.fieldnames)
    # writing body of csv file
    writer.writerows(members_list)

    # setting headers for attaching file
    self.REQUEST.RESPONSE.setHeader('Content-Type', 'text/csv')
    self.REQUEST.RESPONSE.setHeader('Content-Disposition', 'attachment; filename=memberdata-%s.csv' % DateTime().strftime("%Y-%m-%d-%H-%M-%S"))

    return res.getvalue()
