docs: function (config) {
  		if (typeof config === 'undefined') { config = {}; }
  		/**
  		 * the "memory" where the language parts go
  		 */
  		this.memory = {};
  		/**
  		 * If you want to delimit the generated parts
  		 */
  		this.separator = (config.separator) ? config.separator : '';
  		/**
  		 * How many... something... to something.... oh it's been too long I don't remember how this works...
  		 */
  		this.order = (config.order) ? config.order : 2;
  		/**
  		 * Feed text to memory
  		 * @param {String} key key for the chain (so we can store multiple memories)
  		 * @param {String} txt word or phrase
  		 * @return {null} null
  		 */
  		this.learn = function (key, txt) {
  			const mem = (this.memory[key]) ? this.memory[key] : {};
  			// split up text then add the calculated parts to the memory for this ket
  			this.breakText(txt, (key, value) => {
  				// console.log(key);
  				if (!mem[key]) {
  					mem[key] = [];
  				}
  				mem[key].push(value);
  				return mem;
  			});
  			this.memory[key] = mem;
  		};
  		/**
  		 * Return a generated response
  		 * @param {String} key key for the chain (so we can store multiples
  		 * @param {Array} seed letters to start the response (?)
  		 */
  		this.generate = function (key, seed) {
  			if (!seed) {
  				seed = this.genInitial();
  			}
  			this.cur_key = key;
  			return seed.concat(this.step(seed, [])).join(this.separator);
  		};
  		/**
  		 * iterate through, calls self
  		 * @param {Array} state array of most recent x(x=order) elements in chain
  		 * @param {Array} ret the chain
  		 * @return {Array}
  		 */
  		this.step = function (state, ret) {
  			const nextAvailable = this.memory[this.cur_key][state] || [''];
  			const next = this.getRandomValue(nextAvailable);
  			// we don't have anywhere to go
  			if (!next) {
  				return ret;
  			}
  			ret.push(next);
  			var nextState = state.slice(1);
  			nextState.push(next);
  			return this.step(nextState, ret);
  		};
  		/**
  		 * Chunk the word or phrase
  		 * @param {String} txt the text to chunk
  		 * @param {Function} cb callback function
  		 * @return {null} null
  		 */
  		this.breakText = function (txt, cb) {
  			const parts = txt.split(this.separator);
  			const prev = this.genInitial();
  			
  			parts.forEach((v) => {
  				v = v.toLowerCase();
  				cb(prev, v);
  				prev.shift();
  				prev.push(v);
  			});
  			cb(prev, '');
  		};
  		/**
  		 * Generate a starting array for the chain based on the order number
  		 * @return {Array} just an empty array of length=order
  		 */
  		this.genInitial = function () {
  			const ret = [];
  			for (
  				let i = 0;
  				i < this.order;
  				ret.push(''),
  				i++
  			);
  			return ret;
  		};
  		/**
  		 * Get a random array element
  		 * @param {Array} arr an array
  		 * @return {String|Object}	random value
  		 */
  		this.getRandomValue = function (arr) {
  			return arr[Math.floor(Math.random() * arr.length)];
  		};
  	}