private static void ImplementCallMethodOnImplementation(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField)
        {
            /*
             *      if (this.__lazyInitializer == null)
             *              return base.<Method>(args..);
             *      return this.__lazyInitializer.GetImplementation().<Method>(args..)
             */
            var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder);

            var IL = methodOverride.GetILGenerator();

            EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField);

            EmitCallImplementation(IL, method, lazyInitializerField);
            IL.Emit(OpCodes.Ret);

            typeBuilder.DefineMethodOverride(methodOverride, method);
        }
        private static void ImplementCallMethodOnEmbeddedComponentId(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField)
        {
            /*
             *      if (this.__lazyInitializer == null)
             *              return base.<Method>(args..);
             *      this.__lazyInitializer.Identifier.<Method>(args..);
             */
            var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder);

            var IL = methodOverride.GetILGenerator();

            EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField);

            IL.Emit(OpCodes.Ldarg_0);
            IL.Emit(OpCodes.Ldfld, lazyInitializerField);
            IL.Emit(OpCodes.Callvirt, LazyInitializerIdentifierProperty.GetMethod);
            IL.Emit(OpCodes.Unbox_Any, method.DeclaringType);
            EmitCallMethod(IL, OpCodes.Callvirt, method);
            IL.Emit(OpCodes.Ret);

            typeBuilder.DefineMethodOverride(methodOverride, method);
        }
        private static void ImplementSetIdentifier(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField)
        {
            /*
             * set
             * {
             *      if (this.__lazyInitializer == null)
             *              return base.set_<Identifier>(value);
             *      this.__lazyInitializer.Initialize();
             *      this.__lazyInitializer.Identifier = value;
             *      this.__lazyInitializer.GetImplementation().<Identifier> = value;
             * }
             */
            var propertyType   = method.GetParameters()[0].ParameterType;
            var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder);
            var IL             = methodOverride.GetILGenerator();

            EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField);

            IL.Emit(OpCodes.Ldarg_0);
            IL.Emit(OpCodes.Ldfld, lazyInitializerField);
            IL.Emit(OpCodes.Callvirt, LazyInitializerInitializeMethod);

            IL.Emit(OpCodes.Ldarg_0);
            IL.Emit(OpCodes.Ldfld, lazyInitializerField);
            IL.Emit(OpCodes.Ldarg_1);
            if (propertyType.IsValueType)
            {
                IL.Emit(OpCodes.Box, propertyType);
            }
            IL.Emit(OpCodes.Callvirt, LazyInitializerIdentifierProperty.SetMethod);

            EmitCallImplementation(IL, method, lazyInitializerField);

            IL.Emit(OpCodes.Ret);

            typeBuilder.DefineMethodOverride(methodOverride, method);
        }
        private static void ImplementGetIdentifier(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField)
        {
            /*
             * get
             * {
             *      if (this.__lazyInitializer == null)
             *              return base.get_<Identifier>();
             *      return (<ReturnType>)this.__lazyInitializer.Identifier;
             * }
             */
            var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder);

            var IL = methodOverride.GetILGenerator();

            EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField);

            IL.Emit(OpCodes.Ldarg_0);
            IL.Emit(OpCodes.Ldfld, lazyInitializerField);
            IL.Emit(OpCodes.Callvirt, LazyInitializerIdentifierProperty.GetMethod);
            IL.Emit(OpCodes.Unbox_Any, method.ReturnType);
            IL.Emit(OpCodes.Ret);

            typeBuilder.DefineMethodOverride(methodOverride, method);
        }