Stop swimming against the tide and accept what most of the rest of
the world does.
While it adds an annoying depth to the actual source code, it makes
the root directory nicer (no more 'test-res' dirs), means we don't
have to override the gradle config, and makes it nicer to work in
IDEA 2016.1.
If callers specify an implementation then it's the return type they're
concerned about, not the class providing it.
Change-Id: I9d2aa23de47373323cabb362042995f822cd9311
Reviewed-on: http://gerrit.dmdirc.com/3284
Automatic-Compile: DMDirc Build Manager
Reviewed-by: Greg Holmes <greg@dmdirc.com>
Add a new ServiceLocator and legacy implementation
ServiceLocator allows plugins to provide services really
conveniently.
The LegacyServiceLocator is backed by the PluginManager, and checks
for any compatible @Exported methods in loaded plugins. It will not
try to load any plugins that aren't currently loaded.
Issue: CLIENT-445
Change-Id: I61274dbb0b910509e0e170600e473eb23234bb6f
Reviewed-on: http://gerrit.dmdirc.com/3244
Automatic-Compile: DMDirc Build Manager
Reviewed-by: Greg Holmes <greg@dmdirc.com>