import abc
from abc import abstractmethod

class ZfitResult(metaclass=abc.ABCMeta):
    @abstractmethod
    def hesse(self, params, method): ...
    @abstractmethod
    def errors(self, params, method, cl): ...
    @property
    @abc.abstractmethod
    def minimizer(self): ...
    @property
    @abc.abstractmethod
    def params(self): ...
    @property
    @abc.abstractmethod
    def fminopt(self): ...
    @property
    @abc.abstractmethod
    def loss(self): ...

class ZfitMinimizer(abc.ABC, metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def minimize(self, loss, params=None, init=None): ...
    def step(self, loss, params=None) -> None: ...
    @property
    @abc.abstractmethod
    def tol(self): ...
