diff --git a/Plugins/Enums/PluginEnvironment.cs b/Plugins/Enums/PluginEnvironment.cs
index 23702dba..bd4fb2c0 100644
--- a/Plugins/Enums/PluginEnvironment.cs
+++ b/Plugins/Enums/PluginEnvironment.cs
@@ -1,5 +1,8 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
 
 namespace TweetDuck.Plugins.Enums{
     [Flags]
@@ -45,5 +48,50 @@ public static string GetPluginScriptVariables(this PluginEnvironment environment
                 default: return string.Empty;
             }
         }
+
+        public static IReadOnlyDictionary<PluginEnvironment, T> Map<T>(T forNone, T forBrowser, T forNotification){
+            return new PluginEnvironmentDictionary<T>(forNone, forBrowser, forNotification);
+        }
+
+        [SuppressMessage("ReSharper", "MemberHidesStaticFromOuterClass")]
+        private sealed class PluginEnvironmentDictionary<T> : IReadOnlyDictionary<PluginEnvironment, T>{
+            private const int TotalKeys = 3;
+
+            public IEnumerable<PluginEnvironment> Keys => Enum.GetValues(typeof(PluginEnvironment)).Cast<PluginEnvironment>();
+            public IEnumerable<T> Values => data;
+            public int Count => TotalKeys;
+
+            public T this[PluginEnvironment key] => data[(int)key];
+
+            private readonly T[] data;
+
+            public PluginEnvironmentDictionary(T forNone, T forBrowser, T forNotification){
+                this.data = new T[TotalKeys];
+                this.data[(int)PluginEnvironment.None] = forNone;
+                this.data[(int)PluginEnvironment.Browser] = forBrowser;
+                this.data[(int)PluginEnvironment.Notification] = forNotification;
+            }
+
+            public bool ContainsKey(PluginEnvironment key){
+                return key >= 0 && (int)key < TotalKeys;
+            }
+
+            public bool TryGetValue(PluginEnvironment key, out T value){
+                if (ContainsKey(key)){
+                    value = this[key];
+                    return true;
+                }
+                else{
+                    value = default(T);
+                    return false;
+                }
+            }
+
+            public IEnumerator<KeyValuePair<PluginEnvironment, T>> GetEnumerator(){
+                return Keys.Select(key => new KeyValuePair<PluginEnvironment, T>(key, this[key])).GetEnumerator();
+            }
+
+            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
+        }
     }
 }
diff --git a/Plugins/PluginManager.cs b/Plugins/PluginManager.cs
index 53a85bf3..351bfccf 100644
--- a/Plugins/PluginManager.cs
+++ b/Plugins/PluginManager.cs
@@ -12,11 +12,15 @@
 
 namespace TweetDuck.Plugins{
     sealed class PluginManager{
-        private static readonly Dictionary<PluginEnvironment, string> PluginSetupScripts = new Dictionary<PluginEnvironment, string>(4){
-            { PluginEnvironment.None, ScriptLoader.LoadResource("plugins.js") },
-            { PluginEnvironment.Browser, ScriptLoader.LoadResource("plugins.browser.js") },
-            { PluginEnvironment.Notification, ScriptLoader.LoadResource("plugins.notification.js") }
-        };
+        private static IReadOnlyDictionary<PluginEnvironment, string> LoadSetupScripts(){
+            return PluginEnvironmentExtensions.Map(
+                ScriptLoader.LoadResource("plugins.js"),
+                ScriptLoader.LoadResource("plugins.browser.js"),
+                ScriptLoader.LoadResource("plugins.notification.js")
+            );
+        }
+
+        private static readonly IReadOnlyDictionary<PluginEnvironment, string> PluginSetupScripts = LoadSetupScripts();
 
         public string PathOfficialPlugins => Path.Combine(rootPath, "official");
         public string PathCustomPlugins => Path.Combine(rootPath, "user");