add internal function to avoid rewriting from(self).internal