docs: function Camelton(source, destination, options) {
    var _this = this;
  
    if (!(this instanceof Camelton)) {
      return new Camelton(source, destination, options);
    }
  
    /**
     * Parse options.
     *
     * @param {object} options - options object
     * @returns {object}
     */
    function parseOptions(options) {
      var defaultOptions = {
        verbose: false,
        prune: false,
        placeholder: false
      };
      options = options || {};
  
      // Delete sort option if not valid.
      if (options.sort && ['asc', 'desc'].indexOf(options.sort.toLowerCase()) === -1) {
        delete options.sort;
      }
  
      return _.extend(defaultOptions, options);
    }
  
    /**
     * Process source file.
     *
     * @param {string} source - source file
     * @returns {string} resolved source file path
     */
    function processSource(source) {
      var sourceFile = util.resolveFile(source);
  
      if (!sourceFile) {
        throw new Error('Source file not defined or it does not exist.');
      }
      return sourceFile;
    }
  
    /**
     * Process destination file(s).
     *
     * @param {string|Array} destination - destination file or an array of
     * destination files
     * @returns {Array} an array of resolved destination file paths
     */
    function processDestination(destination) {
      var destinations = [];
  
      if (_.isArray(destination)) {
        destinations = destination;
      }
      if (_.isString(destination)) {
        destinations.push(destination);
      }
      if (!destinations.length) {
        throw new Error('Destination file not defined.');
      }
      return destinations.map(util.resolveEnsureFile);
    }
  
    /**
     * Adds line(s) for report.
     *
     * @protected
     *
     * @param {Array} files - an array of files that were handled by Camelton
     * @param {string} category - statistics category
     * @param {string} type - log type: one of `info`, `success`, `warning`, or
     * `error`.
     * @returns {string}
     */
    this.reportAddLine = function(files, category, type) {
      var filesCount = files.length,
          output = [];
  
      category = category ? ' ' + category : '';
      type = type && logSymbols[type] ? type : 'info';
  
      if (filesCount > 0) {
        output.push('\n' + logSymbols[type] + category + ': ' + filesCount +
        (filesCount === 1 ? ' file.' : ' files.'));
  
        if (_this.options.verbose) {
          output.push('\n  ' + files.join('\n'));
        }
      }
  
      return output.join('');
    };
  
    this.options = parseOptions(options);
    this.sourceFile = processSource(source);
    this.destinationFiles = processDestination(destination);
  
    this.statistics = {
      modified: [],
      rejected: []
    };
  }