function deepGet( obj, path, options ) {
	var isStr;
	var props;
	var opts;
	var err;
	if ( !isObjectLike( obj ) ) {
		return;
	}
	isStr = isString( path );
	if ( !isStr && !isArray( path ) ) {
		throw new TypeError( format( 'invalid argument. Key path must be a string or a key array. Value: `%s`.', path ) );
	}
	opts = defaults();
	if ( arguments.length > 2 ) {
		err = validate( opts, options );
		if ( err ) {
			throw err;
		}
	}
	if ( isStr ) {
		props = path.split( opts.sep );
	} else {
		props = path;
	}
	return dget( obj, props );
}
Returns a nested property value.

@param {ObjectLike} obj - input object
@param {(string|Array)} path - key path
@param {Options} [options] - function options
@param {string} [options.sep='.'] - key path separator
@throws {TypeError} second argument must be a string or key array
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@returns {*} nested property value

@example
var obj = { 'a': { 'b': { 'c': 'd' } } };
var val = deepGet( obj, 'a.b.c' );
// returns 'd'

@example
var arr = [
    { 'a': [ {'x': 5} ] },
    { 'a': [ {'x': 10} ] }
];
var val = deepGet( arr, '1.a.0.x' );
// returns 10

@example
var obj = { 'a': { 'b': { 'c': 'd' } } };
var val = deepGet( obj, ['a','b','c'] );
// returns 'd'

@example
var obj = { 'a': { 'b': { 'c': 'd' } } };
var val = deepGet( obj, 'a/b/c', {
    'sep': '/'
});
// returns 'd'