apply' is a general place to put a function which is called on
        every extant record slot.  This is usually the most important function
        to implement when sub-classing.

        The default implementation passes through the slot value as-is, but
        expected exceptions are converted to ``None``.

        args:

            ``value=``\ *value*\ \|\ *AttributeError*\ \|\ *KeyError*
                This is the value currently in the slot, or the Record itself
                with the ``apply_records`` visitor option.  *AttributeError*
                will only be received if you passed ``apply_empty_slots``, and
                *KeyError* will be passed if ``parent_obj`` is a ``dict`` (see
                :py:meth:`Visitor.map_prop` for details about when this might
                happen)

            ``prop=``\ *Property*\ \|\ ``None``
                This is the :py:class:`normalize.Property` instance which
                represents the field being traversed.

                This can be ``None`` when being applied over Collection
                instances, where the type of the contents is not a Record.

            ``visitor=``\ *Visitor*
                This object can be used to inspect parameters of the current
                run, such as options which control which kinds of values are
                visited, which fields are being visited and where the function
                is in relation to the starting point.

def apply(cls, value, prop, visitor):
        """'apply' is a general place to put a function which is called on
        every extant record slot.  This is usually the most important function
        to implement when sub-classing.

        The default implementation passes through the slot value as-is, but
        expected exceptions are converted to ``None``.

        args:

            ``value=``\ *value*\ \|\ *AttributeError*\ \|\ *KeyError*
                This is the value currently in the slot, or the Record itself
                with the ``apply_records`` visitor option.  *AttributeError*
                will only be received if you passed ``apply_empty_slots``, and
                *KeyError* will be passed if ``parent_obj`` is a ``dict`` (see
                :py:meth:`Visitor.map_prop` for details about when this might
                happen)

            ``prop=``\ *Property*\ \|\ ``None``
                This is the :py:class:`normalize.Property` instance which
                represents the field being traversed.

                This can be ``None`` when being applied over Collection
                instances, where the type of the contents is not a Record.

            ``visitor=``\ *Visitor*
                This object can be used to inspect parameters of the current
                run, such as options which control which kinds of values are
                visited, which fields are being visited and where the function
                is in relation to the starting point.
        """
        return (
            None if isinstance(value, (AttributeError, KeyError)) else
            value
        )