code: function _apply(obj) {
          if (obj instanceof Array) {
              for (var i = 0; i < obj.length; i++) {
                  _apply(obj[i]);
              }
          }
          else if (obj && typeof obj == 'object') {
              if (obj.$apply && obj.$apply instanceof Array) {
                  var specs = obj.$apply;
                  for (var i = 0; i < specs.length; i++) {
                      var spec = specs[i];
  
                      var inner = read(path.join(path.dirname(filename),
                                                 spec.file),
                                       spec.vars);
                      var inner_keys = Object.keys(inner);
                      for (var j = 0; j < inner_keys.length; j++) {
                          obj[inner_keys[j]] = inner[inner_keys[j]];
                      }
                  }
                  delete obj['$apply'];
                  _apply(obj);
              }
              else {
                  var keys = Object.keys(obj);
                  for (var i = 0; i < keys.length; i++) {
                      _apply(obj[keys[i]]);
                  }
              }
          }
      }
docs: /*
  Args:
  - `significantScopeLast`: if set to `true`, scopes separated by
  whitespace will be outputted in reverse.  In ST scopes specified
  last have more weight than scopes that specified first; in Atom
  it's reversed.  In MagicPython, we specify scopes putting
  significant scopes first, hence, we need to reverse scopes
  when we generate schema for SublimeText.