@classmethod
def refresh_done(cls, items):
    """Called to mark the end of the refresh phase.

        :param dict items: The items currently in the directory.

        :return: None -- any returned value is ignored.

        When receiving this callback, you know that the refresh phase has 
        completed, and your view of the directory is now consistent with the 
        LDAP server (at least, the part of the directory which 
        matches your search and your access).

        :data:`items` is a dictionary (or, an object which behaves like a
        dictionary) where the keys are DNs and the values are dicts of
        attributes & their values.  Every item in :data:`items` is present in
        the directory at the time this callback started.

        .. note::

            :data:`items` is read-only.  Any attempt to add, change, or delete
            and item will cause an :obj:`AttributeError` to be raised.

        .. warning::

            The content :data:`items` is guaranteed to be consistent *only
            inside this callback*.  Once this callback returns, any attempts to
            access :data:`items` again will result in undefined behavior.

        If you need to do any sort of synchronization with anyone else, this is
        the best time to do it.  Once you return from this callback, the
        persist phase will begin.  If you are operating in refresh-only mode,
        then as soon as this callback completes,
        :meth:`syncrepl_client.Syncrepl.poll` will return :obj:`False`.  It is
        then safe to call :meth:`~syncrepl_client.Syncrepl.unbind`.
        """
    pass
