protected void SetupLoggers(ReflectionHelpers helper)
 {
     var mappedLoggers = false;
     if(_map.namedInterfaceBindings != null)
     {
         foreach(var namedInterfaceBinding in _map.namedInterfaceBindings)
         {
             if(namedInterfaceBinding.InterfaceToMap == typeof(ILogger).ToString())
             {
                 mappedLoggers = true;
                 injectionBinder.Bind<ILogger>()
                     .To(helper.GetTypeInAssemblies(namedInterfaceBinding.TargetType))
                     .ToName(namedInterfaceBinding.nameToMapTo);
                 //injectionBinder.Bind<ILogger>().To<RemoteLogger>().ToName(namedInterfaceBinding.nameToMapTo);
             }
         }
     }
     if(!mappedLoggers)
     {
         injectionBinder.Bind<ILogger>().To<RemoteLogger>().ToName(LogManager.NamedLogger.PRIMARY);
         injectionBinder.Bind<ILogger>().To<UnityLogger>().ToName(LogManager.NamedLogger.SECONDARY);
         injectionBinder.Bind<ILogger>().To<NullDebugLog>().ToName(LogManager.NamedLogger.TERTIARY);
     }
     injectionBinder.Bind<ILogger>().To<LogManager>().ToSingleton().CrossContext();
     //injectionBinder.Bind<>()
 }
        protected IVR mapCamera(ReflectionHelpers helper)
        {
            IVR vrCamera = null;
            if(_map.interfaceMap.ContainsKey("IVR"))
            {
                try
                {
                    vrCamera = Activator.CreateInstance(helper.GetTypeInAssemblies(_map.interfaceMap["IVR"])) as IVR;
                }
                catch(Exception e)
                {
                    //TODO: find a way to get the real logger!
                    Debug.LogError("ERROR_INITIALIXING_IVR_FROM_MAP:" + e);
                }
            }
            if(vrCamera == null)
            {
                if(injectionBinder.GetBinding<IVR>() != null)
                {
                    vrCamera = injectionBinder.GetInstance<IVR>();
                }
            }

            if(vrCamera == null)
                vrCamera = new NullVR();
            var ivrbinding = injectionBinder.GetBinding<IVR>();
            if (ivrbinding == null)
            {
                injectionBinder.Bind<IVR>().ToValue(vrCamera).ToSingleton();
            }
            return vrCamera;
        }
        protected void SetupAnalytics(ReflectionHelpers helper)
        {
            string analyticsTypeName = typeof(IAnalytics).Name;
            List<Type> analyticsSystems = new List<Type>();

            if(_map.interfaceToMultipleMaps.ContainsKey(analyticsTypeName))
            {
                var multiAnalytics = _map.interfaceToMultipleMaps[analyticsTypeName];

                foreach(var analyticsSystemName in multiAnalytics)
                {
                    try
                    {
                        var system = helper.GetTypeInAssemblies(analyticsSystemName);
                        if(system == null)
                        {
                            Debug.LogError("Didd not find desired analytics system:" + analyticsSystemName);
                            continue;
                        }
                        analyticsSystems.Add(system);
                    }
                    catch(Exception e)
                    {
                        Debug.LogError("error setting up analytics system:" + analyticsSystemName + " error:" + e);
                    }
                }
            }
            string initStringKey = InterfaceNamedInjections.ANALYTICS_INITIALIZATION.ToString();
            List<string> listOfInitParams = new List<string>();
            try
            {
                if(_map.namedStringTypes.ContainsKey(initStringKey))
                {
                    string initString = _map.namedStringTypes[initStringKey];
                    if(initString != null)
                    {
                        listOfInitParams = initString.JsonDeserialize<List<string>>();
                    }
                }
            }
            catch(Exception e)
            {
                Debug.LogError("Error while decodnig analytics init:" + e); //fall back to null analytics here?
            }

            injectionBinder.Bind<List<string>>()
                            .ToValue(listOfInitParams)
                            .ToName(InterfaceNamedInjections.ANALYTICS_INITIALIZATION);

            List<IAnalytics> analyticsSystemInstances = new List<IAnalytics>();

            foreach(var analyticsSystem in analyticsSystems)
            {
                //Debug.Log("Initializing analytics sytem:" + analyticsSystem.Name);
                analyticsSystemInstances.Add(Activator.CreateInstance(analyticsSystem) as IAnalytics);
            }

            injectionBinder.Bind<List<IAnalytics>>().ToValue(analyticsSystemInstances);
            injectionBinder.Bind<IAnalytics>().To<AnalyticsManager>().ToSingleton();
        }
        protected override void mapBindings()
        {
            base.mapBindings();
            var helper = new ReflectionHelpers();
            //map singletons
            foreach(var kvp in _map.interfaceMap)
            {
                //injectionBinder.Bind(helper.GetTypeInAssemblies(kvp.Key))
                //	.ToValue(Activator.CreateInstance(helper.GetTypeInAssemblies(kvp.Value))).ToSingleton();
                injectionBinder.Bind(helper.GetTypeInAssemblies(kvp.Key)).To(helper.GetTypeInAssemblies(kvp.Value)).ToSingleton();
            }

            foreach(var namedStringType in _map.namedStringTypes)
            {
                injectionBinder.Bind(namedStringType.Key).To(namedStringType.Value);
            }
            GetPlatform();
            SetupAnalytics(helper);

            var buildConfig = ResourceLoader.Load<BuildConfigSO>();
            injectionBinder.Bind<BuildConfigSO>().ToValue(buildConfig);

            IVR vrCamera = mapCamera(helper);

            injectionBinder.Bind<IRoutineRunner>().ToValue(SingletonManager.instance.AddSingleton<RoutineRunner>());
            //{"interfaceMap":{"IController":"UnityDefaultInputAxisController","IVR":"OculusDesktopVR"},"interfaceToMultipleMaps":{"IAnalytics":["CountlyAnalytics"]},"namedStringTypes":{},"namedIntTypes":{}}
            const string CameraSettingsJsonName = "CameraSettingsJson";
            var cameraSettingsJson = _map.namedStringTypes.ContainsKey(CameraSettingsJsonName)
                ? _map.namedStringTypes[CameraSettingsJsonName]
                : null;
            LoadCamera(vrCamera, vrCamera.GetCameraSettingsSO(), cameraSettingsJson);

            var lifecycle = SingletonManager.instance.AddSingleton<MonobehaviourLifecycleMessages>();
            injectionBinder.Bind<IMonobehaviourLifecycleMessages>().ToValue(lifecycle);

            SetupLoggers(helper);

            //NOTE: not setting StartSignal mapping, leaving that up to subloggers!
        }