text: // HSL to RGB converter. Both methods adapted from:
  // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
  
  function HSLColor(hue, saturation, lightness) {
    this.hue = hue;
    this.saturation = saturation;
    this.lightness = lightness;
  }
  
  function hslToRgb(h, s, l) {
    var r, g, b;
  
    // normalize hue orientation b/w 0 and 360 degrees
    h = h % 360;
    if (h < 0)
      h += 360;
    h = ~~h / 360;
  
    if (s < 0)
      s = 0;
    else if (s > 100)
      s = 100;
    s = ~~s / 100;
  
    if (l < 0)
      l = 0;
    else if (l > 100)
      l = 100;
    l = ~~l / 100;
  
    if (s === 0) {
      r = g = b = l; // achromatic
    } else {
      var q = l < 0.5 ?
        l * (1 + s) :
        l + s - l * s;
      var p = 2 * l - q;
      r = hueToRgb(p, q, h + 1/3);
      g = hueToRgb(p, q, h);
      b = hueToRgb(p, q, h - 1/3);
    }
  
    return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
  }
  
  function hueToRgb(p, q, t) {
    if (t < 0) t += 1;
    if (t > 1) t -= 1;
    if (t < 1/6) return p + (q - p) * 6 * t;
    if (t < 1/2) return q;
    if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
    return p;
  }
  
  HSLColor.prototype.toHex = function () {
    var asRgb = hslToRgb(this.hue, this.saturation, this.lightness);
    var redAsHex = asRgb[0].toString(16);
    var greenAsHex = asRgb[1].toString(16);
    var blueAsHex = asRgb[2].toString(16);
  
    return '#' +
      ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
      ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
      ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
  };
  
  module.exports = HSLColor;
  