def as_version(self, version=Version.latest):
        """Returns a dict that has been modified based on versioning
        in order to be represented in JSON properly

        A class should overload as_version(self, version)
        implementation in order to tailor a more specific representation

        :param version: the relevant version. This allows for variance
         between versions
        :type version: str | unicode

        """
        if not isinstance(self, list):
            result = {}
            for k, v in self.iteritems() if isinstance(self, dict) else vars(self).iteritems():
                k = self._props_corrected.get(k, k)
                if isinstance(v, SerializableBase):
                    result[k] = v.as_version(version)
                elif isinstance(v, list):
                    result[k] = []
                    for val in v:
                        if isinstance(val, SerializableBase):
                            result[k].append(val.as_version(version))
                        else:
                            result[k].append(val)
                elif isinstance(v, uuid.UUID):
                    result[k] = unicode(v)
                elif isinstance(v, datetime.timedelta):
                    result[k] = jsonify_timedelta(v)
                elif isinstance(v, datetime.datetime):
                    result[k] = jsonify_datetime(v)
                else:
                    result[k] = v
            result = self._filter_none(result)
        else:
            result = []
            for v in self:
                if isinstance(v, SerializableBase):
                    result.append(v.as_version(version))
                else:
                    result.append(v)
        return result
Returns a dict that has been modified based on versioning
        in order to be represented in JSON properly

        A class should overload as_version(self, version)
        implementation in order to tailor a more specific representation

        :param version: the relevant version. This allows for variance
         between versions
        :type version: str | unicode