Refactored to mix in EventSource through factory method