Return a decorator, that registers function as capability. Also, all specified exceptions are
		caught and instead of them the :class:`.WClientCapabilityError` exception is raised

		:param cap: target function capability (may be a str or :class:`.WNetworkClientCapabilities` class )
		:param wrap_exceptions: exceptions to caught

		:return: decorator

def capability(cap, *wrap_exceptions):
		""" Return a decorator, that registers function as capability. Also, all specified exceptions are
		caught and instead of them the :class:`.WClientCapabilityError` exception is raised

		:param cap: target function capability (may be a str or :class:`.WNetworkClientCapabilities` class )
		:param wrap_exceptions: exceptions to caught

		:return: decorator
		"""
		if isinstance(cap, WNetworkClientCapabilities) is True:
			cap = cap.value
		elif isinstance(cap, str) is False:
			raise TypeError('Invalid capability type')

		def first_level_decorator(decorated_function):
			def second_level_decorator(original_function, *args, **kwargs):

				if len(wrap_exceptions) == 0:
					return original_function(*args, **kwargs)
				try:
					return original_function(*args, **kwargs)
				except wrap_exceptions as e:
					raise WClientCapabilityError(
						'Error during "%s" capability execution' % cap
					) from e
			result_fn = decorator(second_level_decorator)(decorated_function)
			result_fn.__capability_name__ = cap
			return result_fn
		return first_level_decorator