code: def as_dict(self):
          
          d = {"@module": self.__class__.__module__,
               "@class": self.__class__.__name__}
  
          try:
              parent_module = self.__class__.__module__.split('.')[0]
              module_version = import_module(parent_module).__version__
              d["@version"] = u"{}".format(module_version)
          except AttributeError:
              d["@version"] = None
  
          args = getargspec(self.__class__.__init__).args
  
          def recursive_as_dict(obj):
              if isinstance(obj, (list, tuple)):
                  return [recursive_as_dict(it) for it in obj]
              elif isinstance(obj, dict):
                  return {kk: recursive_as_dict(vv) for kk, vv in obj.items()}
              elif hasattr(obj, "as_dict"):
                  return obj.as_dict()
              return obj
  
          for c in args:
              if c != "self":
                  try:
                      a = self.__getattribute__(c)
                  except AttributeError:
                      try:
                          a = self.__getattribute__("_" + c)
                      except AttributeError:
                          raise NotImplementedError(
                              "Unable to automatically determine as_dict "
                              "format from class. MSONAble requires all "
                              "args to be present as either self.argname or "
                              "self._argname, and kwargs to be present under"
                              "a self.kwargs variable to automatically "
                              "determine the dict format. Alternatively, "
                              "you can implement both as_dict and from_dict.")
                  d[c] = recursive_as_dict(a)
          if hasattr(self, "kwargs"):
              d.update(**self.kwargs)
          if hasattr(self, "_kwargs"):
              d.update(**self._kwargs)
          return d
docs: A JSON serializable dict representation of an object.