void Compile <T, TProperty>(Expression <Func <T, TProperty> > propertyExpression,
                                    Func <NodeSelectorFactory, NodeSelectorFactory> selectorConfigurator)
            where T : class
        {
            var conditionFactory = new ConditionAlphaNodeSelectorFactory(_configurator, node => _alphaNodes.Add(node));

            var alphaFactory = new AlphaNodeSelectorFactory(conditionFactory, _configurator);

            NodeSelectorFactory factory = selectorConfigurator(alphaFactory);

            Compile(propertyExpression, factory);
        }
        void AddCompareCondition <T, TProperty>(Expression <Func <T, TProperty> > propertyExpression,
                                                CompareNode <T, TProperty> compareNode)
            where T : class
        {
            var conditionFactory = new ConditionAlphaNodeSelectorFactory(_configurator, node => _alphaNodes.Add(node));

            var alphaFactory = new AlphaNodeSelectorFactory(conditionFactory, _configurator);

            var compareFactory = new CompareNodeSelectorFactory <TProperty>(alphaFactory, _configurator,
                                                                            compareNode.Comparator,
                                                                            compareNode.Value);

            Compile(propertyExpression, compareFactory);
        }