Переопределение базовых функций в Dart

Иногда возникает необходимость использовать имена функций базовой библиотеки в качестве названий методов собственных классов, например, MyClass.print(). Но в некоторых случаях, внутри таких методов необходимо обращаться к одноименным базовым функциям, как показано в следующем пример:

class LoggerConsoleAdapter {
  print(String message) { 
    // здесь необходимо вызвать глобальную функцию print 
    print(message.toLowerCase());
  }
}

void main() {
  LoggerConsoleAdapter log = new LoggerConsoleAdapter ();
  log.print("test");
}

Но, выполнение такого кода не приведет нас к желаемому результату, и во время выполнения мы получим ошибку "Maximum call stack size exceeded". Это случится потому, что компилятор начнет рекурсивно вызывать LoggerConsoleAdapter.print до тех пор пока не переполнится стек.

Для решения данной проблемы, необходимо заменить вызов глобальной функции print внутри нашего метода LoggerConsoleAdapter.print, на вызов функции с каким-нибудь другим именем, например:

// определим "синонимы" для глобальной функции print
Function coreFunctionPrintV1;
coreFunctionPrintV2(m) => print(m); 

class LoggerConsoleAdapter {
  print(String message) {
    // теперь не возникает рекурсивного вызова метода, а вызывается глобальная функция print
    coreFunctionPrintV2(message);
    coreFunctionPrintV1(message);
  }
}

void main() {
  // определим именованную функцию coreFunctionPrintV1 
  coreFunctionPrintV1 = print;
  
  LoggerConsoleAdapter log = new LoggerConsoleAdapter();
  log.print("test");
}