public static function getValue( $array, $key, $default = NULL ) {
		if ( $key instanceof \Closure ) {
			return $key( $array, $default );
		}
		if ( is_array( $key ) ) {
			$lastKey = array_pop( $key );
			foreach ( $key as $keyPart ) {
				$array = static::getValue( $array, $keyPart );
			}
			$key = $lastKey;
		}
		if ( is_array( $array ) && ( isset( $array[ $key ]) || array_key_exists( $key, $array ) ) ) {
			return $array[ $key ];
		}
		if ( ( $pos = strrpos( $key, '.') ) !== FALSE ) {
			$array = static::getValue( $array, substr( $key, 0, $pos ), $default );
			$key   = substr( $key, $pos + 1);
		}
		if ( is_object( $array ) ) {
			// this is expected to fail if the property does not exist, or __get() is not implemented
			// it is not reliably possible to check whether a property is accessable beforehand
			return $array->$key;
		} elseif ( is_array( $array ) ) {
			return ( isset( $array[ $key ]) || array_key_exists( $key, $array ) ) ? $array[ $key ] : $default;
		} else {
			return $default;
		}
	}