Restructured to allow annotation and 'injection' of DataProviders and DataConsumers