add internal function