private IAstRefOrValue ConvertMappingValue(
			ReadWriteSimple rwMapOp,
			int operationId,
			IAstRefOrValue sourceValue)
		{
			IAstRefOrValue convertedValue = sourceValue;
			if (rwMapOp.Converter != null)
			{
				convertedValue = AstBuildHelper.CallMethod(
					rwMapOp.Converter.GetType().GetMethod("Invoke"),
                    new AstCastclassRef(
					    (IAstRef)AstBuildHelper.ReadMemberRV(
					         GetStoredObject(operationId, typeof(ReadWriteSimple)),
					         typeof(ReadWriteSimple).GetProperty("Converter")
					    ),
                        rwMapOp.Converter.GetType()
                    ),
					new List<IAstStackItem>()
                    {
                        sourceValue,
						AstBuildHelper.ReadLocalRV(locState),
                    }
				);
			}
			else
			{
				if (rwMapOp.ShallowCopy && rwMapOp.Destination.MemberType == rwMapOp.Source.MemberType)
				{
					convertedValue = sourceValue;
				}
				else
				{
					var mi = staticConvertersManager.GetStaticConverter(rwMapOp.Source.MemberType, rwMapOp.Destination.MemberType);
					if (mi != null)
					{
						convertedValue = AstBuildHelper.CallMethod(
							mi,
							null,
							new List<IAstStackItem> { sourceValue }
						);
					}
					else
					{
						convertedValue = ConvertByMapper(rwMapOp);
					}
				}
			}

			return convertedValue;
		}
		private IAstRefOrValue ConvertByMapper(ReadWriteSimple mapping)
		{
			IAstRefOrValue convertedValue;
			ObjectsMapperDescr mapper = objectsMapperManager.GetMapperInt(
				mapping.Source.MemberType,
				mapping.Destination.MemberType,
				mappingConfigurator);
			int mapperId = AddObjectToStore(mapper);

			convertedValue = AstBuildHelper.CallMethod(
				typeof(ObjectsMapperBaseImpl).GetMethod(
					"Map",
					new Type[] { typeof(object), typeof(object), typeof(object) }
					),

				new AstReadFieldRef
				{
					fieldInfo = typeof(ObjectsMapperDescr).GetField("mapper"),
                    sourceObject = GetStoredObject(mapperId, mapper.GetType())
				},

				new List<IAstStackItem>()
                    {
						AstBuildHelper.ReadMembersChain(
							AstBuildHelper.ReadLocalRA(locFrom),
							mapping.Source.MembersChain
						),
						AstBuildHelper.ReadMembersChain(
							AstBuildHelper.ReadLocalRA(locTo),
							mapping.Destination.MembersChain
						),
						(IAstRef)AstBuildHelper.ReadLocalRA(locState)
                    }
				);
			return convertedValue;
		}
		private IAstNode ProcessReadWriteSimple(ReadWriteSimple readWriteSimple, int operationId)
		{
			IAstRefOrValue sourceValue = ReadSrcMappingValue(readWriteSimple, operationId);

            IAstRefOrValue convertedValue;

            if (readWriteSimple.NullSubstitutor != null && (ReflectionUtils.IsNullable(readWriteSimple.Source.MemberType) || !readWriteSimple.Source.MemberType.IsValueType))
            {
                convertedValue = new AstIfTernar(
                    ReflectionUtils.IsNullable(readWriteSimple.Source.MemberType)
                        ? (IAstValue)new AstExprNot(AstBuildHelper.ReadPropertyRV(new AstValueToAddr((IAstValue)sourceValue), readWriteSimple.Source.MemberType.GetProperty("HasValue")))
                        : new AstExprIsNull(sourceValue),
                        GetNullValue(readWriteSimple.NullSubstitutor), // source is null
                        AstBuildHelper.CastClass(
                            ConvertMappingValue(
                                readWriteSimple,
                                operationId,
                                sourceValue
                            ),
                            readWriteSimple.Destination.MemberType
                        )
                );
            }
            else
            {
                convertedValue =
                    ConvertMappingValue(
                        readWriteSimple,
                        operationId,
                        sourceValue
                    );
            }

			IAstNode result = WriteMappingValue(readWriteSimple, operationId, convertedValue);

			if (readWriteSimple.SourceFilter != null)
			{
				result = Process_SourceFilter(readWriteSimple, operationId, result);
			}

			if (readWriteSimple.DestinationFilter != null)
			{
				result = Process_DestinationFilter(readWriteSimple, operationId, result);
			}
			return result;
		}