code: def atstart(callback, *args, **kwargs):
      '''Schedule a callback to run before the main hook.
  
      Callbacks are run in the order they were added.
  
      This is useful for modules and classes to perform initialization
      and inject behavior. In particular:
  
          - Run common code before all of your hooks, such as logging
            the hook name or interesting relation data.
          - Defer object or module initialization that requires a hook
            context until we know there actually is a hook context,
            making testing easier.
          - Rather than requiring charm authors to include boilerplate to
            invoke your helper's behavior, have it run automatically if
            your object is instantiated or module imported.
  
      This is not at all useful after your hook framework as been launched.
      '''
      global _atstart
      _atstart.append((callback, args, kwargs)f atstart(callback, *args, **kwargs):
      '''Schedule a callback to run before the main hook.
  
      Callbacks are run in the order they were added.
  
      This is useful for modules and classes to perform initialization
      and inject behavior. In particular:
  
          - Run common code before all of your hooks, such as logging
            the hook name or interesting relation data.
          - Defer object or module initialization that requires a hook
            context until we know there actually is a hook context,
            making testing easier.
          - Rather than requiring charm authors to include boilerplate to
            invoke your helper's behavior, have it run automatically if
            your object is instantiated or module imported.
  
      This is not at all useful after your hook framework as been launched.
      '''
      global _atstart
      _atstart.append((callback, args, kwargs))
docs: Schedule a callback to run before the main hook.
  
      Callbacks are run in the order they were added.
  
      This is useful for modules and classes to perform initialization
      and inject behavior. In particular:
  
          - Run common code before all of your hooks, such as logging
            the hook name or interesting relation data.
          - Defer object or module initialization that requires a hook
            context until we know there actually is a hook context,
            making testing easier.
          - Rather than requiring charm authors to include boilerplate to
            invoke your helper's behavior, have it run automatically if
            your object is instantiated or module imported.
  
      This is not at all useful after your hook framework as been launched.