docs: function(data, wordlist) {
    if (!(this instanceof Mnemonic)) {
      return new Mnemonic(data, wordlist);
    }
  
    if (_.isArray(data)) {
      wordlist = data;
      data = null;
    }
  
  
    // handle data overloading
    var ent, phrase, seed;
    if (Buffer.isBuffer(data)) {
      seed = data;
    } else if (_.isString(data)) {
      phrase = unorm.nfkd(data);
    } else if (_.isNumber(data)) {
      ent = data;
    } else if (data) {
      throw new bitcore.errors.InvalidArgument('data', 'Must be a Buffer, a string or an integer');
    }
    ent = ent || 128;
  
  
    // check and detect wordlist
    wordlist = wordlist || Mnemonic._getDictionary(phrase);
    if (phrase && !wordlist) {
      throw new errors.UnknownWordlist(phrase);
    }
    wordlist = wordlist || Mnemonic.Words.ENGLISH;
  
    if (seed) {
      phrase = Mnemonic._entropy2mnemonic(seed, wordlist);
    }
  
  
    // validate phrase and ent
    if (phrase && !Mnemonic.isValid(phrase, wordlist)) {
      throw new errors.InvalidMnemonic(phrase);
    }
    if (ent % 32 !== 0 || ent < 128) {
      throw new bitcore.errors.InvalidArgument('ENT', 'Values must be ENT > 128 and ENT % 32 == 0');
    }
  
    phrase = phrase || Mnemonic._mnemonic(ent, wordlist);
  
    Object.defineProperty(this, 'wordlist', {
      configurable: false,
      value: wordlist
    });
  
    Object.defineProperty(this, 'phrase', {
      configurable: false,
      value: phrase
    });
  }