private Signature(Object o) throws SignatureException {
    final ObjectFactory factory = GlobalObjectFactory.createElementsObjectFactory();
    this.subject = o;

    if (this.subject instanceof TCancNFe) {
      this.referenceUri = "#" + ((TCancNFe) this.subject).getInfCanc().getId();
      this.document = XmlTransformer.jaxbToDocument(factory.createCancNFe((TCancNFe) this.subject));

    } else if (this.subject instanceof TInutNFe) {
      this.referenceUri = "#" + ((TInutNFe) this.subject).getInfInut().getId();
      this.document = XmlTransformer.jaxbToDocument(factory.createInutNFe((TInutNFe) this.subject));

    } else if (this.subject instanceof TNFe) {
      this.referenceUri = "#" + ((TNFe) this.subject).getInfNFe().getId();
      this.document = XmlTransformer.jaxbToDocument(factory.createNFe((TNFe) this.subject));

    } else {
      throw new SignatureException(
          "Tipo incompat\u00edvel. Esperado um dos seguintes tipos: "
              + TCancNFe.class.getSimpleName()
              + ", "
              + TInutNFe.class.getSimpleName()
              + " ou "
              + TNFe.class.getSimpleName());
    }

    // Verifica se a referencia e valida (nao apenas '#').
    if ("#".equals(this.referenceUri)) {
      throw new SignatureException(
          "A refer\u00eancia est\u00e1 incompleta. Verifique se o ID do objeto possui um valor v\u00e1lido. No caso da NFe, lembre-se de gerar a chave de acesso.");
    }
  }