code: function probe(addr, config) {
      // Do not reassign function argument
      var _config = config || {};
  
      // Convert callback base system command to promise base
      var deferred = Q.defer();
  
      // Spawn a ping process
      var ping = null;
      var platform = os.platform();
      try {
          var argumentBuilder = builderFactory.createBuilder(platform);
          ping = cp.spawn(
              builderFactory.getExecutablePath(platform, _config.v6),
              argumentBuilder.getResult(addr, _config)
          );
      } catch (err) {
          deferred.reject(err);
          return deferred.promise;
      }
  
      // Initial parser
      var parser = parserFactory.createParser(platform, _config);
  
      // Register events from system ping
      ping.once('error', function () {
          var err = new Error(
              util.format(
                  'ping.probe: %s. %s',
                  'there was an error while executing the ping program. ',
                  'Check the path or permissions...'
              )
          );
          deferred.reject(err);
      });
  
      // Cache all lines from the system ping
      var outstring = [];
      ping.stdout.on('data', function (data) {
          outstring.push(String(data));
      });
  
      // Parse lines we have on closing system ping
      ping.once('close', function () {
          // Merge lines we have and split it by \n
          var lines = outstring.join('').split('\n');
  
          // Parse line one by one
          __.each(lines, parser.eat, parser);
  
          // Get result
          var ret = parser.getResult();
  
          deferred.resolve(ret);
      });
  
      return deferred.promise;
  }
docs: Class::PromisePing
  
  @param {string} addr - Hostname or ip addres
  @param {PingConfig} config - Configuration for command ping
  @return {Promise}