from abc import abstractmethod


class Step:
    """
    Base abstract class for experiment's steps. It has three stages: pre, call and post.

    """
    def pre(self):
        pass

    @abstractmethod
    def call(self, *args, **kwargs):
        pass

    def post(self):
        pass

    def init(self):
        pass

    def __call__(self, *args, **kwargs):
        self.pre()
        res = self.call(*args, **kwargs)
        self.post()
        return res
