refactor Replayer hierarchy, add CompositeReplayer