hidden internal implementation