\subsection{Cardano.BM.Plugin}
\label{code:Cardano.BM.Plugin}

%if style == newcode
\begin{code}
{-# LANGUAGE MultiParamTypeClasses #-}
module Cardano.BM.Plugin
  ( Plugin (..)
  , loadPlugin
  )
  where

import           Cardano.BM.Backend.Log (Scribe)
import           Cardano.BM.Backend.Switchboard (Switchboard,
                     addExternalBackend, addExternalScribe)
import           Cardano.BM.Data.Backend
import           Cardano.BM.Data.BackendKind ()
import           Cardano.BM.Data.Output

\end{code}
%endif

\subsubsection{Plugins extend functionality}\label{code:Plugin}\index{Plugin}
A |Plugin| has a name and is either a |Backend| or a |Scribe|.
\begin{code}

data Plugin a = BackendPlugin !(Backend a) BackendKind
              | ScribePlugin Scribe ScribeId
\end{code}

\subsubsection{Plugin behaviour}

\subsubsection{Integrating plugins}
\begin{code}
loadPlugin :: Switchboard a -> Plugin a -> IO ()
loadPlugin :: Switchboard a -> Plugin a -> IO ()
loadPlugin Switchboard a
sb (BackendPlugin Backend a
be BackendKind
bk) = do
    Switchboard a -> Backend a -> BackendKind -> IO ()
forall a. Switchboard a -> Backend a -> BackendKind -> IO ()
addExternalBackend Switchboard a
sb Backend a
be BackendKind
bk
loadPlugin Switchboard a
sb (ScribePlugin Scribe
sc ScribeId
nm) = do
  Switchboard a -> Scribe -> ScribeId -> IO ()
forall a. Switchboard a -> Scribe -> ScribeId -> IO ()
addExternalScribe Switchboard a
sb Scribe
sc ScribeId
nm

\end{code}