text: """
      SleekXMPP: The Sleek XMPP Library
      Copyright (C) 2010 Nathanael C. Fritz
      This file is part of SleekXMPP.
  
      See the file LICENSE for copying permission.
  """
  
  
  class base_plugin(object):
  
      """
      The base_plugin class serves as a base for user created plugins
      that provide support for existing or experimental XEPS.
  
      Each plugin has a dictionary for configuration options, as well
      as a name and description.
  
      The lifecycle of a plugin is:
          1. The plugin is instantiated during registration.
          2. Once the XML stream begins processing, the method
             plugin_init() is called (if the plugin is configured
             as enabled with {'enable': True}).
          3. After all plugins have been initialized, the
             method post_init() is called.
  
      Recommended event handlers:
          session_start -- Plugins which require the use of the current
                           bound JID SHOULD wait for the session_start
                           event to perform any initialization (or
                           resetting). This is a transitive recommendation,
                           plugins that use other plugins which use the
                           bound JID should also wait for session_start
                           before making such calls.
          session_end   -- If the plugin keeps any per-session state,
                           such as joined MUC rooms, such state SHOULD
                           be cleared when the session_end event is raised.
  
      Attributes:
          xep          -- The XEP number the plugin implements, if any.
          description  -- A short description of the plugin, typically
                          the long name of the implemented XEP.
          xmpp         -- The main SleekXMPP instance.
          config       -- A dictionary of custom configuration values.
                          The value 'enable' is special and controls
                          whether or not the plugin is initialized
                          after registration.
          post_initted -- Executed after all plugins have been initialized
                          to handle any cross-plugin interactions, such as
                          registering service discovery items.
          enable       -- Indicates that the plugin is enabled for use and
                          will be initialized after registration.
  
      Methods:
          plugin_init  -- Initialize the plugin state.
          post_init    -- Handle any cross-plugin concerns.
      """
  
      def __init__(self, xmpp, config=None):
          """
          Instantiate a new plugin and store the given configuration.
  
          Arguments:
              xmpp   -- The main SleekXMPP instance.
              config -- A dictionary of configuration values.
          """
          if config is None:
              config = {}
          self.xep = None
          self.rfc = None
          self.description = 'Base Plugin'
          self.xmpp = xmpp
          self.config = config
          self.post_inited = False
          self.enable = config.get('enable', True)
          if self.enable:
              self.plugin_init()
  
      def plugin_init(self):
          """
          Initialize plugin state, such as registering any stream or
          event handlers, or new stanza types.
          """
          pass
  
      def post_init(self):
          """
          Perform any cross-plugin interactions, such as registering
          service discovery identities or items.
          """
          self.post_inited = True
  