private void createTheReturnValue(ParameterExpression variable, BlockPlan plan)
        {
            var        label        = Expression.Label(_pluginType);
            Expression returnTarget = variable;

            plan.Add(Expression.Return(label, returnTarget, _pluginType));
            plan.Add(Expression.Label(label, variable));
        }
        private ParameterExpression addPluginTypeVariable(BlockPlan plan)
        {
            var pluginTypeVariable = plan.FindVariableOfType(_pluginType);

            if (pluginTypeVariable == null)
            {
                pluginTypeVariable = Expression.Variable(_pluginType, "returnValue");
                plan.AddVariable(pluginTypeVariable);

                plan.Add(Expression.Assign(pluginTypeVariable, Expression.Convert(_variable, _pluginType)));
            }
            return(pluginTypeVariable);
        }
        public Expression ToExpression(ParameterExpression session, ParameterExpression context)
        {
            // Seed the plan with the inner value
            var inner = _inner.ToExpression(session, context);
            var plan  = new BlockPlan();

            plan.AddVariable(_variable);
            var assignment = Expression.Assign(_variable, inner);

            plan.Add(assignment);

            addActivations(plan);

            var pluginTypeVariable = addPluginTypeVariable(plan);

            addDecorators(context, pluginTypeVariable, plan);

            createTheReturnValue(pluginTypeVariable, plan);

            return(plan.ToExpression());
        }
 private void addActivations(BlockPlan plan)
 {
     plan.AddVariables(_activators.SelectMany(x => x.ToParameterExpressions(_inner.ReturnedType)));
     plan.Add(_activators.SelectMany(x => x.CreateExpressions(_policies, _variable)).ToArray());
 }
        private void addDecorators(ParameterExpression context, ParameterExpression pluginTypeVariable, BlockPlan plan)
        {
            _decorators.Each(decorator => {
                var decoratedExpression = decorator.ToExpression(_policies, context, pluginTypeVariable);
                var wrapped             =
                    TryCatchWrapper.WrapFunc <StructureMapInterceptorException>(
                        "Decorator Interceptor failed during object construction.  See the inner exception", _pluginType,
                        decoratedExpression, decorator);

                plan.Add(Expression.Assign(pluginTypeVariable, wrapped));
            });
        }