'Returns whether or not the data has changed on the ``Item``.
Optionally accepts a ``data`` argument, which accepts the output from
``self._determine_alterations()`` if you\'ve already called it. Typically
unnecessary to do. Default is ``None``.
Example:
>>> user.needs_save()
False
>>> user[\'first_name\'] = \'Johann\'
>>> user.needs_save()
True'

def needs_save(self, data=None):

    if (data is None):
        data = self._determine_alterations()
    needs_save = False
    for kind in ['adds', 'changes', 'deletes']:
        if len(data[kind]):
            needs_save = True
            break
    return needs_save
