docs: function(fields){
      var sources = {};
      var toNames = {};
      var fromNames = {};
      var result = {
        defaultSource: false,
        fieldSource: {},
        toNames: toNames,
        fromNames: fromNames,
        sources: sources,
        __extend__: fieldsExtend
      };
  
      // default source is a source that defined for star rule
      if (fields['*'])
        result.defaultSource = fields['*'];
  
      // process fields from definition
      for (var field in fields)
      {
        var def = fields[field].split(':');
        var sourceName = def.shift();
        var sourceField = def.length ? def.join(':') : field;
  
        if (sourceName == result.defaultSource)
        {
          /** @cut */ if (field != '*')
          /** @cut */   basis.dev.warn('basis.data.object.Merge: source `' + sourceName + '` has already defined for any field (star rule), definition this source for `' + field + '` field is superfluous (ignored).');
          continue;
        }
  
        if (sourceName == '-' && sourceField != field)
        {
          /** @cut */ basis.dev.warn('basis.data.object.Merge: custom field name can\'t be used for own properties, definition `' + field + ': "' + fields[field] + '"` ignored.');
          continue;
        }
  
        if (!toNames[sourceName])
        {
          toNames[sourceName] = {};
          fromNames[sourceName] = {};
        }
  
        toNames[sourceName][field] = sourceField;
        fromNames[sourceName][sourceField] = field;
        result.fieldSource[field] = sourceName;
      }
  
      // generate source values getters
      for (var sourceName in toNames)
        sources[sourceName] = generateDataGetter(toNames[sourceName]);
  
      // generate values getter for default source
      if (result.defaultSource)
        sources[result.defaultSource] = function(data){
          var res = {};
          for (var key in data)
            if (key in result.fieldSource == false)
              res[key] = data[key];
          return res;
        };
  
      return result;
    }