allows you to overload operators and tries to chose the right one based on the objects' types