@classmethod
def find(cls, *args, **kwargs):
    """ Grabs a set of elements from the DB.
        Note: This returns a generator, so you can't do an efficient count.
        To get a count, use the count() function which accepts the same
        arguments as find() with the exception of non-query fields like sort,
        limit, skip.
        """
    options = {}
    for option in ['sort', 'limit', 'skip', 'batch_size']:
        if option in kwargs:
            options[option] = kwargs[option]
            del options[option]
    if ('batch_size' in options and 'skip' not in options and 'limit' not in
        options):
        current_skip = 0
        limit = options['batch_size']
        found_something = True
        while found_something:
            found_something = False
            result = cls.collection().find(*args, **kwargs)
            result = result.skip(current_skip).limit(limit)
            if 'sort' in options:
                result = result.sort(options['sort'])
            for obj in result:
                found_something = True
                yield cls(obj, from_find=True)
            current_skip += limit
    else:
        result = cls._find(*args, **kwargs)
        if 'sort' in options:
            result = result.sort(options['sort'])
        if 'skip' in options:
            result = result.skip(options['skip'])
        if 'limit' in options:
            result = result.limit(options['limit'])
        for sql_thing in result.fetchall():
            obj = cls._transform_object(sql_thing)
            yield cls(obj, from_find=True)
