@classmethod
def record_add(cls, dn, attrs):
    """Called to indicate the addition of a new LDAP record.

        :param str dn: The DN of the added record.

        :param attrs: The record's attributes.
        :type attrs: Dict of lists of bytes

        :return: None - any returned value is ignored.

        .. warning::

            :data:`attrs` is passed by reference.  If you modify the
            dictionary—or its contents—in any way, you will pay for it later!

        This callback can happen in all modes, and in all phases, to indicate 
        that an entry has been added to your view of the search results.  In 
        refresh-only mode, and the refresh phase of refresh-and-perist mode, 
        the addition may have taken place at any time since your last update.  
        In the persist phase of refresh-and-persist mode, a new entry has just 
        been added—or modified—such that it matches your search.
        
        Attributes which are not present in the record will not present in
        `attrs`.  Dict keys are attribute names, and dict values are arrays
        (to support multi-valued attributes).

        .. note::

            Just because the dict values are arrays, does not mean that all
            attributes are multi-valued.  The LDAP client does not know which
            attributes are single- and which are multi-valued, so it assumes
            that all are multi-valued.

            Also, all attribute values will come in as (in Python 2) :obj:`str`
            objects or (in Python 3) :obj:`bytes` objects.
            
            To learn which attributes are single- or multi-valued, and to learn
            the type (or, in LDAP terms, the *syntax*) of an attribute, you
            need to look at the schema, possibly using :mod:`ldap.schema`.
        """
    pass
