Loops through all data elements and allows a function to interact
        with each data element.  Uses a generator to improve iteration.

        :param fn: Function that interacts with each DICOM element

def walk(self, fn):
        """ Loops through all data elements and allows a function to interact
        with each data element.  Uses a generator to improve iteration.

        :param fn: Function that interacts with each DICOM element """
        if not hasattr(fn, "__call__"):
            raise TypeError("""walk_dataset requires a
                function as its parameter""")

        dataset = self._dataset
        iterator = dataset.GetDES().begin()
        while (not iterator.equal(dataset.GetDES().end())):
            data_element = iterator.next()
            yield fn(data_element)

        header = self._header
        iterator = header.GetDES().begin()
        while (not iterator.equal(header.GetDES().end())):
            data_element = iterator.next()
            yield fn(data_element)