    'use strict';

    const has = (o, k) => Object.prototype.hasOwnProperty.call(o, k);

    /**
     * Utility methods
     */
    class Util {

        constructor() {
            throw new Error(`The ${this.constructor.name} class may not be instantiated.`);
        }

        /**
         * Sets default properties on an object that aren't already specified.
         * @param {Object} def Default properties
         * @param {Object} given Object to assign defaults to
         * @returns {Object}
         * @private
         */
        static mergeDefault(def, given) {
            if (!given) return def;
            for (const key in def) {
                if (!has(given, key) || given[key] === undefined) {
                    given[key] = def[key];
                } else if (given[key] === Object(given[key])) {
                    given[key] = Util.mergeDefault(def[key], given[key]);
                }
            }

            return given;
        }
    }

    module.exports = Util;