public Cart(IRule discountRule,
                    IsolationMode appDomainMode = IsolationMode.Shared,
                    IsolationMode runtimeMode   = IsolationMode.Shared,
                    IsolationMode scopeMode     = IsolationMode.Shared)
        {
            if (discountRule == null)
            {
                throw new ArgumentNullException(
                          "discountRule");
            }
            _appDomainMode = appDomainMode;
            _runtimeMode   = runtimeMode;
            _scopeMode     = scopeMode;

#if PASS_BY_VALUE
            if (_appDomainMode == IsolationMode.Private)
            {
                discountRule.ExpectedReturnValueNames =
                    new[] { "cart" }
            }
            ;
#endif

#if USE_SAFE_ENGINE
            _ruleEngine = new RuleEngine(_appDomainMode);
            _ruleHandle = _ruleEngine.InsertRule(
                discountRule, _runtimeMode);
#else
            _ruleEngine = new UnsafeRuleEngine();
            _ruleHandle = _ruleEngine.InsertRule(
                discountRule);
#endif
            _ruleParameters =
                new Dictionary <string, object>
            {
                {
                    "cart",
                    this
                }
            };
        }