Returns an :class:`ordered dictionary <collections.OrderedDict>` which
        contains the ``{'member name': field attribute}`` or the
        ``{'member name': dict(field attributes)}`` pairs for each :class:`Field`
        *nested* in the `Structure`.

        The *attributes* of each :class:`Field` for containers *nested* in the
        `Structure` 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 nested in the
            `Structure` 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 ``{'member name': field attribute}`` or the
        ``{'member name': dict(field attributes)}`` pairs for each :class:`Field`
        *nested* in the `Structure`.

        The *attributes* of each :class:`Field` for containers *nested* in the
        `Structure` 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 nested in the
            `Structure` views their referenced :attr:`~Pointer.data` object field
            attributes as well (chained method call).
        """
        members = OrderedDict()
        for name, item in self.items():
            # Container
            if is_container(item):
                members[name] = item.view_fields(*attributes, **options)
            # Pointer
            elif is_pointer(item) and get_nested(options):
                members[name] = item.view_fields(*attributes, **options)
            # Field
            elif is_field(item):
                if attributes:
                    field_getter = attrgetter(*attributes)
                else:
                    field_getter = attrgetter('value')
                if len(attributes) > 1:
                    fieldnames = options.get('fieldnames', attributes)
                    members[name] = dict(zip(fieldnames, field_getter(item)))
                else:
                    members[name] = field_getter(item)

        return members