Альтернативой, которую вы можете рассмотреть, является динамические прокси . Это позволяет использовать API в стиле отражения для обработки запросов, сделанных для данного интерфейса - было бы очень просто делегировать все вызовы базовой реализации, добавив при этом некоторую логику регистрации, если имя метода совпадает с одним из методов take.
Недостаток этого подхода состоит в том, что он добавляет немного дополнительной служебной информации ко всем вызовам методов (почти наверняка пренебрежимо мал для общего использования, хотя это должен быть желтый флаг, если используется в разделе, критичном к производительности), и код может завершиться выглядит громоздким. В конечном итоге вы определяете точно такое же поведение, которое вы описываете в своем посте, за исключением того, что вам не нужно явно писать каждый делегирующий метод, а предоставлять своего рода подстановочную реализацию.