implement generic projection
add documentation comments