protected internal AbstractExpression(IScope scope, IExpressionConfigurationVisitor visitor) {
            if (scope != null) {
                Scope = scope;
            }

            Visitor = visitor;
        }
        public Scope(IScope scope, IExpressionConfigurationVisitor visitor)
            : base(scope, visitor) {
            
            VariablesStore = new Dictionary<string, Variable>();

            if (scope != null) {
                ParentScope = scope;
                RootScope = ParentScope.RootScope;
            }
        }
		public static Expression Invoke(InvokeExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) {
			return new InvokeExpressionReader(configuration, scope, visitor);
		}
 internal abstract Expression Accept(IScope scope, IExpressionConfigurationVisitor visitor);
		public static Expression Parameter(ParameterExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) {
			return new ParameterExpressionReader(configuration, scope, visitor);
		}
		public static Expression Default(DefaultExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) {
			return new DefaultExpressionReader(configuration, scope, visitor);
		}
		public static Expression New(NewExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) {
			return new NewExpressionReader(configuration, scope, visitor);
		}
		public static Expression Lambda(LambdaExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) {
			return new LambdaExpressionReader(configuration, scope, visitor);
		}
		internal DefaultExpressionReader(DefaultExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) 
			: base(scope, visitor) {

			_configuration = configuration;
			ReadConfiguration(configuration);	
		}
		internal ParameterExpressionReader(ParameterExpressionConfiguration configuration, IScope scope, IExpressionConfigurationVisitor visitor) 
			: base(scope, visitor) {

			_configuration = configuration;
			ReadConfiguration(configuration);	
		}
		internal override Expression Accept(IScope scope, IExpressionConfigurationVisitor visitor) {
            return visitor.Visit(scope, this);
        }