Same as `defineSubClass` with out side-effect of `extend` method and `toString` method.
@function module:sjl.defineSubClassPure
@param superClass {Function} - Superclass to inherit from.
@param constructor {Function|Object} - Required.  Note:  If this param is an object, then other params shift over by 1 (`methods` becomes `statics` and this param becomes `methods` (constructor key expected else empty stand in constructor is used).
@param methods {Object|undefined} - Methods for prototype.  Optional.  Note:  If `constructor` param is an object, this param takes the place of the `statics` param.
@param statics {Object|undefined} - Constructor's static methods.  Optional.  Note:  If `constructor` param is an object, this param is not used.
@returns {Function} - Constructor with extended prototype and added statics.
function defineSubClassPure (superClass, constructor, methods, statics) {
        var normalizedArgs = normalizeArgsForDefineSubClass.apply(null, arguments),
            _superClass = normalizedArgs.superClass,
            _statics = normalizedArgs.statics,
            _constructor = normalizedArgs.constructor,
            _methods = normalizedArgs.methods;

        // Set prototype
        _constructor.prototype = Object.create(_superClass.prototype);

        // Define constructor
        Object.defineProperty(_constructor.prototype, 'constructor', {value: _constructor});

        // Extend constructor
        extend(_constructor.prototype, _methods);
        extend(_constructor, _statics, true);

        // Return constructor
        return _constructor;
    }