# Source code for openff.evaluator.workflow.plugins

    """
    An API for registering new workflow protocols.

    Attributes
    ----------
    registered_workflow_protocols: dict of str and type of Protocol
        The workflow protocols which have been registered as being
        available to use in property estimations.
    """
    registered_workflow_protocols = {}

    def register_workflow_protocol(protocol_class):
        """Registers a class as being a protocol which may be included
        in workflows.
        """
        from openff.evaluator.workflow.protocols import Protocol

        assert issubclass(protocol_class, Protocol)

        if protocol_class.__name__ in registered_workflow_protocols:
            raise ValueError(f"The {protocol_class} protocol is already registered.")

        registered_workflow_protocols[protocol_class.__name__] = protocol_class

    def workflow_protocol():
        """A decorator which registers a class as being a protocol
        which may be included in workflows.
        """

        def decorator(cls):
            register_workflow_protocol(cls)
            return cls

        return decorator