docs: def _from_nested_schema(self, obj, field):
          """Support nested field."""
          if isinstance(field.nested, basestring):
              nested = get_class(field.nested)
          else:
              nested = field.nested
  
          name = nested.__name__
          outer_name = obj.__class__.__name__
          only = field.only
          exclude = field.exclude
  
          # If this is not a schema we've seen, and it's not this schema,
          # put it in our list of schema defs
          if name not in self._nested_schema_classes and name != outer_name:
              wrapped_nested = self.__class__(nested=True)
              wrapped_dumped = wrapped_nested.dump(
                  nested(only=only, exclude=exclude)
              )
  
              # Handle change in return value type between Marshmallow
              # versions 2 and 3.
              if marshmallow.__version__.split('.', 1)[0] >= '3':
                  self._nested_schema_classes[name] = wrapped_dumped
              else:
                  self._nested_schema_classes[name] = wrapped_dumped.data
              self._nested_schema_classes.update(
                  wrapped_nested._nested_schema_classes
              )
  
          # and the schema is just a reference to the def
          schema = {
              'type': 'object',
              '$ref': '#/definitions/{}'.format(name)
          }
  
          # NOTE: doubled up to maintain backwards compatibility
          metadata = field.metadata.get('metadata', {})
          metadata.update(field.metadata)
  
          for md_key, md_val in metadata.items():
              if md_key == 'metadata':
                  continue
              schema[md_key] = md_val
  
          if field.many:
              schema = {
                  'type': ["array"] if field.required else ['array', 'null'],
                  'items': schema,
              }
  
          return schema