Переработанно с поддержкой template