All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
!-----------------------------------------------------------------------------
! Package     : GaudiPluginService
! Responsible : Marco Clemencic
! Purpose     : Provide a generic plugin service.
! Commit Id   : ce1274ce7ddd2188f6c1f62d6323d6dd041cc85f
!-----------------------------------------------------------------------------

========================== GaudiPluginService v3r1 ===========================

! 2015-10-26 - commit de80db5

 - More modernization changes

   Fix (almost) all warnings from clang 3.7, and use clang-modernize to further
   modernize the code.

   Fixes GAUDI-1118.

   See merge request !49


! 2015-10-16 - commit bf01805

 - Merge branch 'GAUDI-1111' into 'master'

   remove dependency on Boost from GaudiPluginService

   Reverted the part of commit dddeca32 that introduce the dependency on Boost.

   Fixes GAUDI-1111.

   See merge request !53

========================== GaudiPluginService v3r0 ===========================

! 2015-09-11 - commit c062cbe

 - C++11 modernization changes

   Some trivial - and some not so trivial! - changes which take advantage of
   C++11...

   See merge request !7

========================== GaudiPluginService v2r2 ===========================
! 2014-07-04 - Marco Clemencic
 - Improved Doxygen documentation.

========================== GaudiPluginService v2r1 ===========================
! 2014-10-28 - Marco Clemencic
 - Demangle factory types in warning messages.

========================== GaudiPluginService v2r0 ===========================
! 2014-09-30 - David Quarrie
 - do not hide C++11 constructs from Reflex for ATLAS (different version of
   GCCXML)

! 2014-05-07 - Sebastien Binet
 - leverage C++11 variadic templates for the factories.
 - internally, also use r-value references and std::forward
 - hide the C++11 constructs from Reflex as GCC-XML parser predates C++11

========================== GaudiPluginService v1r2 ===========================
! 2014-05-12 - Marco Clemencic
 - Fixed listcomponents command lines tests (CMake only).

========================== GaudiPluginService v1r1 ===========================

! 2014-05-19 - Charles Leggett
 - add HAVE_GAUDI_PLUGINSVC tag for cmt requirements

! 2014-05-09 - Charles Leggett
 - add macro HAVE_GAUDI_PLUGINSVC so external packages can see if it's available

! 2014-05-09 - Marco Clemencic
 - Improved command line of listcomponents: now it accepts --output and --help.
 - Modified the listcomponents CMT document to use --output instead of output
   redirection. Fixes bug #104455

========================== GaudiPluginService v1r0 ===========================
! 2014-02-03 - Marco Clemencic
 - Added support for Reflex names for components, enabled with the compile flag
   -DGAUDI_REFLEX_COMPONENT_ALIASES.

! 2014-01-10 - Marco Clemencic
 - Fixed error handling in listcomponents.cpp: exit with a failure status code
   if there is an error loading a library.

! 2013-12-19 - Marco Clemencic
 - Minor fix to CMake configuration.

! 2013-08-28 - Sebastien Binet
 - Added (C++) tests for optional metadata (properties).
 - Added docstrings to the python interface.

! 2013-08-27 - Marco Clemencic
 - Fixed symbol visibility.

! 2013-08-23 - Marco Clemencic
 - Updated the CMT configuration.

! 2013-08-23 - Sebastien Binet
 - Added optional metadata (properties) to the factories.
 - Added a Python module to query the list of factories (based on ctypes).

! 2013-07-26 - Marco Clemencic
 - Ported new GaudiPluginService to CMT.

! 2013-07-25 - Marco Clemencic
 - Removed the extra level of indirection and simplified the support for
   private/protected constructors.

! 2013-07-25 - Marco Clemencic
 - Added an extra level of indirection (a creator class) to allow components
   with protected/private constructors.

! 2013-07-24 - Marco Clemencic
 - Do not use the type name in the helper local class created by the DECLARE_*
   macros: it's not really needed and it allows the use of namespaces and
   templates in the parameter passed to DECLARE_*.

! 2013-07-24 - Marco Clemencic
 - Added some tests.

! 2013-07-23 - Marco Clemencic
 - Added thread safety (with locks) if compiled with C++11.

! 2013-07-23 - Marco Clemencic
 - Changes the dlopen flags from (RTLD_LAZY | RTLD_LOCAL) to
   (RTLD_LAZY | RTLD_GLOBAL) to avoid problems with Python binary modules
   imported through the Python C/C++ API.
   The Python binary modules may not be linked to the Python library, so they
   need that the Python symbols are visible globally.

! 2013-07-19 - Marco Clemencic
 - Added instructions for the Plugin Service in a README.md file.

! 2013-07-18 - Marco Clemencic
 - Modified the symbol resolution policy when loading a component library,
   using RTLD_LAZY instead of RTLD_NOW.
   It allows loading of component libraries with unresolved symbols, but it is
   consistent with the old behavior.

! 2013-07-18 - Marco Clemencic
 - Added the macros DECLARE_COMPONENT and DECLARE_COMPONENT_WITH_ID to simplify
   the declaration of component classes when the factory is declared as the
   typedef Factory in a base class.
   In the example below the declaration becomes:

       #include "MyDerivedComponent.h"
       DECLARE_COMPONENT(MyDerivedComponent)

! 2013-07-18 - Marco Clemencic
 - Fixed a problem when the DECLARE_* macros are called from within a namespace.

! 2013-07-17 - Marco Clemencic
 - First complete implementation of a ROOT/Reflex-free Plugin Service for
   Gaudi. The typical use is:

   - headers

     #include 

     class IMyInterface { ... };

     class MyBaseComponent: virtual public IMyInterface {
     public:
       typedef Gaudi::PluginService::Factory1
                                              Factory;
       MyBaseComponent(const std::string&);
       ...
     };

     class MyDerivedComponent: public MyBaseComponent {
       ...
     };

   - sources

     #include "MyDerivedComponent.h"
     DECLARE_FACTORY(MyDerivedComponent, MyBaseComponent::Factory)

   - to instantiate

     #include "MyBaseComponent.h"
     IMyInterface* ptr =
         MyBaseComponent::Factory::create("MyDerivedComponent", "argument");