App Providers
=============

An :term:`app provider` is a :term:`provider` which can "extend" the
main :term:`app handler`.

The provider generally does this by adding extra methods to the app
handler.  Note that it does this regardless of which app handler is
configured to be used.

:class:`~wuttjamaican.app.AppProvider` is the base class.


Adding a new Provider
---------------------

First define your provider class.  Note that the method names should
include a "prefix" unique to your project (``poser_`` in this case).
This is to avoid naming collisions with the app handler itself, as
well as other app providers.  So e.g. in ``poser/app.py``::

   from wuttjamaican.app import AppProvider

   class PoserAppProvider(AppProvider):
       """
       App provider for Poser system
       """

       # nb. method name uses 'poser_' prefix
       def poser_do_something(self, **kwargs):
           """
           Do something for Poser
           """
           print("did something")

Register the :term:`entry point` in your ``setup.cfg``:

.. code-block:: ini

   [options.entry_points]

   wutta.providers =
       poser = poser.app:PoserAppProvider

Assuming you have not customized the app handler proper, then you will
be using the *default* app handler yet it will behave as though it has
the "provided" methods::

   from wuttjamaican.conf import make_config

   # make normal app
   config = make_config()
   app = config.get_app()

   # whatever this does..
   app.poser_do_something()