"""
Support for @synchronized blocks

The python class object_lock is a contextmanager for with statements that
can also be used manually.
"""
import objc as _objc


class object_lock:
    """
    A context manager that implements the same feature as
    @synchronized statements in Objective-C. Locking can also
    be done manually using the ``lock`` and ``unlock`` methods.

    The mutex for object ``anObject`` is represented by
    ``objc.object_lock(anObject)``.

    Usage:

        with object_lock(anObject):
            ...
    """

    def __init__(self, value):
        self.__value = value

    def __enter__(self):
        _objc._objc_sync_enter(self.__value)

    def __exit__(self, exc_type, value, tp):
        _objc._objc_sync_exit(self.__value)

    def lock(self):
        _objc._objc_sync_enter(self.__value)

    def unlock(self):
        _objc._objc_sync_exit(self.__value)
