def abstract(func):
    """
    An abstract decorator. Raises a NotImplementedError if called.
    
    :param func: The function.
    :return: The wrapper function.
    """
    # noinspection PyUnusedLocal
    # pylint: disable=unused-argument
    def wrapper(*args, **kwargs):
        raise NotImplementedError('{} has not been implemented'.format(func.__name__))

    func.__isabstractmethod__ = True
    return wrapper