docs: function(fields, options) {
              fields  = this.__resolveFields(fields);
              options = this.__resolveOptions(options);
  
              var property = fields.shift();
  
              if (options.check) {
                  this.__checkProperty(property, {
                      readable: true,
                      method:  'get',
                      params:   _.toArray(arguments)
                  });
              }
  
              var value = this.__applyGetters(property, this['_' + property]);
  
              for (var i = 0, ii = fields.length; i < ii; ++i) {
  
                  var field = fields[i];
  
                  if (!(field in value)) {
                      throw new Error('Property "' + [property].concat(fields.slice(0, i+1)).join('.') + '" does not exists!');
                  }
  
                  value = this.__applyGetters(property, value[field], fields.slice(0, i+1));
              }
  
              if (options.emit && this.__checkEmitEvent()) {
                  var prop = [property].concat(fields).join('.');
  
                  this.__emitEvent('property.' + prop + '.get',  value);
                  this.__emitEvent('property.get', prop, value);
              }
  
              return value;
          }