# Path: src/lupin/validators/validator.py
# class Validator(object):
#     """Validators base class"""
# 
#     def __and__(self, other):
#         """Combine current validator with another one using the & operator
# 
#         Returns:
#             ValidatorsAndCombination
#         """
#         return lupin.ValidatorsAndCombination([self, other])
# 
#     def __or__(self, other):
#         """Combine current validator with another one using the | operator
# 
#         Returns:
#             ValidatorsOrCombination
#         """
#         return lupin.ValidatorsOrCombination([self, other])
# 
# Path: src/lupin/errors.py
# class ValidationError(Exception):
#     """Base class for validation errors"""
# 
#     def __init__(self, message, path):
#         """
#         Args:
#             message (str): error message
#             path (list): path of the invalid data
#         """
#         super(ValidationError, self).__init__(message)
#         self.path = path


from .validators import Validator
from .errors import ValidationError

    def __call__(self, *args, **kwargs):
        """Null combination does nothing"""

    def __and__(self, other):
        return ValidatorsAndCombination([other])

    def __or__(self, other):
        return ValidatorsOrCombination([other])


class ValidatorsAndCombination(object):
    """Represents an & combination of validators.
    It raise error if at least one validator is invalid.
    """
    def __init__(self, validators):
        """
        Args:
            validators list<Validator>: a list of validator
        """
        self._validators = validators

    def __call__(self, *args, **kwargs):
        for validator in self._validators:
            validator(*args, **kwargs)

    def __and__(self, other):
        if isinstance(other, ValidatorsAndCombination):
            self._validators.extend(other._validators)
            return self

# Path: src/lupin/validators/validator.py
# class Validator(object):
#     """Validators base class"""
# 
#     def __and__(self, other):
#         """Combine current validator with another one using the & operator
# 
#         Returns:
#             ValidatorsAndCombination
#         """
#         return lupin.ValidatorsAndCombination([self, other])
# 
#     def __or__(self, other):
#         """Combine current validator with another one using the | operator
# 
#         Returns:
#             ValidatorsOrCombination
#         """
#         return lupin.ValidatorsOrCombination([self, other])
# 
# Path: src/lupin/errors.py
# class ValidationError(Exception):
#     """Base class for validation errors"""
# 
#     def __init__(self, message, path):
#         """
#         Args:
#             message (str): error message
#             path (list): path of the invalid data
#         """
#         super(ValidationError, self).__init__(message)
#         self.path = path


# Path: src/lupin/validators_combination.py
from .validators import Validator
from .errors import ValidationError


    def __call__(self, *args, **kwargs):
        """Null combination does nothing"""

    def __and__(self, other):
        return ValidatorsAndCombination([other])

    def __or__(self, other):
        return ValidatorsOrCombination([other])


class ValidatorsAndCombination(object):
    """Represents an & combination of validators.
    It raise error if at least one validator is invalid.
    """
    def __init__(self, validators):
        """
        Args:
            validators list<Validator>: a list of validator
        """
        self._validators = validators

    def __call__(self, *args, **kwargs):
        for validator in self._validators:
            validator(*args, **kwargs)

    def __and__(self, other):
        if isinstance(other, ValidatorsAndCombination):
            self._validators.extend(other._validators)
            return self

        elif isinstance(other, Validator):