code: def structure(cls):
          # type: () -> Text
          
  
          if cls.signature is NotImplemented:
              raise NotImplementedError("no signature defined")
  
          up = cls.cutter.elucidate()
          down = str(Seq(up).reverse_complement())
          ovhg = cls.cutter.ovhgseq
          upsig, downsig = cls.signature
  
          if cls.cutter.is_5overhang():
              upsite = "^{}_".format(ovhg)
              downsite = "_{}^".format(Seq(ovhg).reverse_complement())
          else:
              upsite = "_{}^".format(ovhg)
              downsite = "^{}_".format(Seq(ovhg).reverse_complement())
  
          if issubclass(cls, AbstractModule):
              return "".join(
                  [
                      up.replace(upsite, "({})(".format(upsig)),
                      "N*",
                      down.replace(downsite, ")({})".format(downsig)),
                  ]
              )
          elif issubclass(cls, AbstractVector):
              return "".join(
                  [
                      down.replace(downsite, "({})(".format(downsig)),
                      "N*",
                      up.replace(upsite, ")({})".format(upsig)),
                  ]
              )
          else:
              raise RuntimeError("Part must be either a module or a vector!")
docs: Get the part structure, as a DNA regex pattern.
  
          The structure of most parts can be obtained automatically from the
          part signature and the restriction enzyme used in the Golden Gate
          assembly.
  
          Warning:
              If overloading this method, the returned pattern must include 3
              capture groups to capture the following features:
  
              1. The upstream (5') overhang sequence
              2. The vector placeholder sequence
              3. The downstream (3') overhang sequence