Refactored to use ServiceLoader