A
Был бы статический язык - было бы не особо сложно.
Смотрим на левый операнд, смотрим является ли он объектом и есть ли у него метод. Если есть, вызываем.
Если нет - смотрим есть ли функция с таким именем. Если есть вызываем её передава левый операнд первым параметром.
Если ни того ни другого нет - выдаем ошибку.