code: function Slider(elem) {
    check(elem, 'elem').is.anInstanceOf(Element)();
  
    var priv = {};
    priv.elem = elem;
    priv.transitions = [];
    priv.phaser = phaser(elem);
    priv.slides = [];
    priv.upgrader = upgrader(elem);
    priv.listeners = {};
    priv.tempClasses = [];
    priv.fromIndex = 1;
    priv.toIndex = 0;
    priv.started = false;
  
    var pub = {};
  
    /**
     * Array containing all slide elements.
     *
     * @type Array
     * @access read-only
     *
     * @fqn Slider.prototype.slides
     */
    pub.slides = priv.slides;
  
    /**
     * Index of currently active slide.
     *
     * Set to `null` if ${link Slider.prototype.start} was not called on this slider.
     *
     * @type Number
     * @access read-write
     *
     * @fqn Slider.prototype.currentIndex
     */
    pub.currentIndex = null;
    Object.defineProperty(pub, 'currentIndex', {
      get: function() { return priv.slides.length !== 0? priv.toIndex: null; },
      set: partial(moveTo, priv),
    });
  
    /**
     * Currently active slide element.
     *
     * Set to `null` if ${link Slider.prototype.start} was not called on this slider.
     *
     * @type Element
     * @access read-write
     *
     * @fqn Slider.prototype.currentSlide
     */
    pub.currentSlide = null;
    Object.defineProperty(pub, 'currentSlide', {
      get: function() { return priv.slides.length !== 0? priv.slides[priv.toIndex]: null; },
      set: function() { throw new Error('read only property! please use currentIndex instead'); },
    });
  
    bindMethods(pub, [
      start,
      moveTo,
      moveToNext,
      moveToPrevious,
      on,
      removeListener,
    ], priv);
  
    priv.pub = pub;
    return pub;
  }
docs: public 
  Constructs the slider.
  
  @param {Element} elem DOM element for the slider
  
  @fqn Slider.prototype.constructor