refactoring Intersection logic out into separate OO componentes
add abstract factory for intersect objects