    /**
     * @file extend.js
     * @module extend
     */

    /**
     * A combination of node inherits and babel's inherits (after transpile).
     * Both work the same but node adds `super_` to the subClass
     * and Bable adds the superClass as __proto__. Both seem useful.
     *
     * @param {Object} subClass
     *        The class to inherit to
     *
     * @param {Object} superClass
     *        The class to inherit from
     *
     * @private
     */
    const _inherits = function(subClass, superClass) {
      if (typeof superClass !== 'function' && superClass !== null) {
        throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
      }

      subClass.prototype = Object.create(superClass && superClass.prototype, {
        constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }
      });

      if (superClass) {
        // node
        subClass.super_ = superClass;
      }
    };

    /**
     * Function for subclassing using the same inheritance that
     * videojs uses internally
     *
     * @static
     * @const
     *
     * @param {Object} superClass
     *        The class to inherit from
     *
     * @param {Object} [subClassMethods={}]
     *        The class to inherit to
     *
     * @return {Object}
     *         The new object with subClassMethods that inherited superClass.
     */
    const extendFn = function(superClass, subClassMethods = {}) {
      let subClass = function() {
        superClass.apply(this, arguments);
      };

      let methods = {};

      if (typeof subClassMethods === 'object') {
        if (subClassMethods.constructor !== Object.prototype.constructor) {
          subClass = subClassMethods.constructor;
        }
        methods = subClassMethods;
      } else if (typeof subClassMethods === 'function') {
        subClass = subClassMethods;
      }

      _inherits(subClass, superClass);

      // Extend subObj's prototype with functions and other properties from props
      for (const name in methods) {
        if (methods.hasOwnProperty(name)) {
          subClass.prototype[name] = methods[name];
        }
      }

      return subClass;
    };

    export default extendFn;