text: var domEach = require('../utils').domEach,
      _ = {
        pick: require('lodash.pick'),
      };
  
  var toString = Object.prototype.toString;
  
  /**
   * Set / Get css.
   *
   * @param {String|Object} prop
   * @param {String} val
   * @return {self}
   * @api public
   */
  
  exports.css = function(prop, val) {
    if (arguments.length === 2 ||
      // When `prop` is a "plain" object
      (toString.call(prop) === '[object Object]')) {
      return domEach(this, function(idx, el) {
        setCss(el, prop, val, idx);
      });
    } else {
      return getCss(this[0], prop);
    }
  };
  
  /**
   * Set styles of all elements.
   *
   * @param {String|Object} prop
   * @param {String} val
   * @param {Number} idx - optional index within the selection
   * @return {self}
   * @api private
   */
  
  function setCss(el, prop, val, idx) {
    if ('string' == typeof prop) {
      var styles = getCss(el);
      if (typeof val === 'function') {
        val = val.call(el, idx, styles[prop]);
      }
  
      if (val === '') {
        delete styles[prop];
      } else if (val != null) {
        styles[prop] = val;
      }
  
      el.attribs.style = stringify(styles);
    } else if ('object' == typeof prop) {
      Object.keys(prop).forEach(function(k){
        setCss(el, k, prop[k]);
      });
    }
  }
  
  /**
   * Get parsed styles of the first element.
   *
   * @param {String} prop
   * @return {Object}
   * @api private
   */
  
  function getCss(el, prop) {
    var styles = parse(el.attribs.style);
    if (typeof prop === 'string') {
      return styles[prop];
    } else if (Array.isArray(prop)) {
      return _.pick(styles, prop);
    } else {
      return styles;
    }
  }
  
  /**
   * Stringify `obj` to styles.
   *
   * @param {Object} obj
   * @return {Object}
   * @api private
   */
  
  function stringify(obj) {
    return Object.keys(obj || {})
      .reduce(function(str, prop){
        return str += ''
          + (str ? ' ' : '')
          + prop
          + ': '
          + obj[prop]
          + ';';
      }, '');
  }
  
  /**
   * Parse `styles`.
   *
   * @param {String} styles
   * @return {Object}
   * @api private
   */
  
  function parse(styles) {
    styles = (styles || '').trim();
  
    if (!styles) return {};
  
    return styles
      .split(';')
      .reduce(function(obj, str){
        var n = str.indexOf(':');
        // skip if there is no :, or if it is the first/last character
        if (n < 1 || n === str.length-1) return obj;
        obj[str.slice(0,n).trim()] = str.slice(n+1).trim();
        return obj;
      }, {});
  }
  