Adds caching to inverseFor and implements look for inverses on the other side

lets mark this as private and give it a lovely underscore, so people use `inverseFor`