code: function parseLine(line) {
  	let origin = null;
  	let command = null;
  	const args = [];
  	if (line.length === 0) {
  		// empty line is not valid
  		return null;
  	}
  	let spaceAt;
  	// first, parse the origin (if any)
  	if (line.charAt(0) === ':') {
  		spaceAt = line.indexOf(' ');
  		if (spaceAt !== -1) {
  			origin = line.substring(1, spaceAt);
  			line = line.substring(spaceAt + 1);
  		} else {
  			// one word that starts with a : is not valid
  			return null;
  		}
  	}
  	if (line.length === 0) {
  		// no command? invalid line
  		return null;
  	}
  	// second, parse the command
  	spaceAt = line.indexOf(' ');
  	if (spaceAt !== -1) {
  		command = line.substr(0, spaceAt);
  		line = line.substring(spaceAt + 1);
  	} else {
  		command = line;
  		line = null;
  	}
  	// now parse the args
  	while (line !== null && line.length > 0) {
  		if (line.charAt(0) === ':') {
  			args.push(line.substring(1));
  			line = null;
  		} else {
  			spaceAt = line.indexOf(' ');
  			if (spaceAt !== -1) {
  				args.push(line.substring(0, spaceAt));
  				line = line.substring(spaceAt + 1);
  			} else {
  				args.push(line);
  				line = null;
  			}
  		}
  	}
  	return {
  		origin: origin,
  		command: command,
  		args: args
  	};
  }
docs: returns: { origin, command, args[] }