вот эта функция очень странно используется, и как объект и как функция
достаточно сложно и можно запутаться

я бы попробовал переписать на  что-то более простое