Returns an :class:`ordered dictionary <collections.OrderedDict>` which
        contains the selected field *attributes* of the `Pointer` field itself
        extended with a ``['data']`` key which contains the selected field *attribute*
        or the dictionaries of the selected field *attributes* for each :class:`Field`
        *nested* in the :attr:`data` object referenced by the `Pointer` field.

        The *attributes* of each :class:`Field` for containers *nested* in the
        :attr:`data` object referenced by the `Pointer` field are viewed as well
        (chained method call).

        :param str attributes: selected :class:`Field` attributes.
            Fallback is the field :attr:`~Field.value`.
        :keyword tuple fieldnames: sequence of dictionary keys for the selected
            field *attributes*. Defaults to ``(*attributes)``.
        :keyword bool nested: if ``True`` all :class:`Pointer` fields in the
            :attr:`data` object referenced by the `Pointer` field views their
            referenced :attr:`~Pointer.data` object field attributes as well
            (chained method call).

def view_fields(self, *attributes, **options):
        """ Returns an :class:`ordered dictionary <collections.OrderedDict>` which
        contains the selected field *attributes* of the `Pointer` field itself
        extended with a ``['data']`` key which contains the selected field *attribute*
        or the dictionaries of the selected field *attributes* for each :class:`Field`
        *nested* in the :attr:`data` object referenced by the `Pointer` field.

        The *attributes* of each :class:`Field` for containers *nested* in the
        :attr:`data` object referenced by the `Pointer` field are viewed as well
        (chained method call).

        :param str attributes: selected :class:`Field` attributes.
            Fallback is the field :attr:`~Field.value`.
        :keyword tuple fieldnames: sequence of dictionary keys for the selected
            field *attributes*. Defaults to ``(*attributes)``.
        :keyword bool nested: if ``True`` all :class:`Pointer` fields in the
            :attr:`data` object referenced by the `Pointer` field views their
            referenced :attr:`~Pointer.data` object field attributes as well
            (chained method call).
        """
        items = OrderedDict()

        # Pointer field
        if attributes:
            field_getter = attrgetter(*attributes)
        else:
            field_getter = attrgetter('value')

        if len(attributes) > 1:
            for key, value in zip(attributes, field_getter(self)):
                items[key] = value
        else:
            items['value'] = field_getter(self)

        # Data object
        if is_container(self._data):
            # Container
            items['data'] = self._data.view_fields(*attributes, **options)
        elif is_pointer(self._data) and get_nested(options):
            # Pointer
            items['data'] = self._data.view_fields(*attributes, **options)
        elif is_field(self._data):
            # Field
            if attributes:
                field_getter = attrgetter(*attributes)
            else:
                field_getter = attrgetter('value')
            if len(attributes) > 1:
                fieldnames = options.get('fieldnames', attributes)
                items['data'] = dict(zip(fieldnames, field_getter(self._data)))
            else:
                items['data'] = field_getter(self._data)
        else:
            # None
            items['data'] = self._data
        return items