docs: function parseAbstracts(abstracts, constructor) {
          var optsStatic = { isStatic: true },
              key,
              value,
              unallowed;
  
          // Check argument
          if (!isObject(abstracts)) {
              throw new Error('$abstracts defined in abstract class "' + constructor.prototype.$name + '" must be an object.');
          }
  
          // Check reserved keywords
          checkKeywords(abstracts);
  
          // Check unallowed keywords
          unallowed = testKeywords(abstracts, ['$statics']);
          if (unallowed) {
              throw new Error('$statics inside $abstracts of abstract class "' + constructor.prototype.$name + '" contains an unallowed keyword: "' + unallowed + '".');
          }
  
          if (hasOwn(abstracts, '$statics')) {
              // Check argument
              if (!isObject(abstracts.$statics)) {
                  throw new Error('$statics definition in $abstracts of abstract class "' + constructor.prototype.$name + '" must be an object.');
              }
  
              // Check keywords
              checkKeywords(abstracts.$statics, 'statics');
  
              // Check unallowed keywords
              unallowed = testKeywords(abstracts.$statics);
              if (unallowed) {
                  throw new Error('$statics inside $abstracts of abstract class "' + constructor.prototype.$name + '" contains an unallowed keyword: "' + unallowed + '".');
              }
  
              for (key in abstracts.$statics) {
                  value = abstracts.$statics[key];
  
                  // Check if it is not a function
                  if (!isFunction(value) || value[$interface] || value[$class]) {
                      throw new Error('Abstract member "' + key + '" found in abstract class "' + constructor.prototype.$name + '" is not a function.');
                  }
  
                  addMethod(key, value, constructor, optsStatic);
              }
  
              delete abstracts.$statics;
          }
  
          for (key in abstracts) {
              value = abstracts[key];
  
              // Check if it is not a function
              if (!isFunction(value) || value[$interface] || value[$class]) {
                  throw new Error('Abstract member "' + key + '" found in abstract class "' + constructor.prototype.$name + '" is not a function.');
              }
  
              addMethod(key, value, constructor);
          }
      }