class BaseRetryBackoff(object):

    def delay_amount(self, context):
        """Calculate how long we should delay before retrying.

        :type context: RetryContext

        """
        raise NotImplementedError("delay_amount")


class BaseRetryableChecker(object):
    """Base class for determining if a retry should happen.

    This base class checks for specific retryable conditions.
    A single retryable checker doesn't necessarily indicate a retry
    will happen.  It's up to the ``RetryPolicy`` to use its
    ``BaseRetryableCheckers`` to make the final decision on whether a retry
    should happen.
    """

    def is_retryable(self, context):
        """Returns True if retryable, False if not.

        :type context: RetryContext
        """
        raise NotImplementedError("is_retryable")