separate the functionality from the multimethod