class _Callback:
    __slots__ = ["hooks"]

    def __init__(self, hooks=None):
        self.hooks = hooks

    def call(self, hook, *args, **kwargs):
        callback = self.hooks.get(hook)
        if callback is not None:
            return callback(*args, **kwargs)


def callback(*, set_size=None, relative_update=None, absolute_update=None, **hooks):
    return _Callback(
        set_size=set_size,
        relative_update=relative_update,
        absolute_update=absolute_update,
        hooks=hooks,
    )


def is_callback(obj):
    return isinstance(obj, _Callback)

@@ -1,15 +1,14 @@
 class 
-_
 Callback
@@ -9,16 +9,16 @@
 llback:%0A
+
     __sl
@@ -63,18 +63,15 @@
 lf, 
+**
 hooks
-=None
 ):%0A 
@@ -353,16 +353,992 @@
     
+%22%22%22Create a new callback for filesystem APIs.%0A%0A    Parameters%0A    ----------%0A    set_size: Callable%5B%5Bint%5D, None%5D (optional)%0A        When transferring something quantifiable (e.g bytes in a file, or%0A        number of files), this hook will be called with the total number of%0A        items.%0A%0A    relative_update: Callable%5B%5Bint%5D, None%5D (optional)%0A        Update the total transferred items relative to the previous position.%0A        If the current cursor is at N, and a relative_update(Q) happens then%0A        the current cursor should now point at the N+Q.%0A%0A    absolute_update: Callable%5B%5Bint%5D, None%5D (optional)%0A        Update the total transferred items to an absolute position. If%0A        the current cursor is at N, and a absolute_update(Q) happens then%0A        the current cursor should now point at the Q. If another one happens%0A        it will override the current value.%0A%0A    hooks: Callable%5B..., Any%5D%0A        Optional hooks that are not generally available.%0A    %22%22%22%0A%0A    
 return 
-_
 Call
@@ -1464,14 +1464,10 @@
     
-hooks=
+**
 hook
@@ -1476,69 +1476,7 @@
 %0A   
- 
-)%0A%0A%0Adef is_callback(obj):%0A    return isinstance(obj, _Callback
+ 
 )%0A

document the new API, make Callback public