much more abstraction and lang definitions