Use abstract classes for pattern base classes
Capture all possible identifier types

And do reducution inferrence