From d9e6f5a10d13d54f4ee9aee08aecfa9f9d9c35df Mon Sep 17 00:00:00 2001
From: John Firebaugh <john.firebaugh@gmail.com>
Date: Thu, 20 Oct 2016 13:27:26 -0700
Subject: [PATCH] Clean up {Bucket,StyleLayer}.create

* Replace switch with object lookup
* Avoid delayed requires
* Eliminate the need for eslint-disable-line
---
 js/data/bucket.js       | 47 ++++++++++++++++++++---------------------
 js/style/style_layer.js | 29 +++++++++----------------
 2 files changed, 33 insertions(+), 43 deletions(-)

diff --git a/js/data/bucket.js b/js/data/bucket.js
index fea04983316..c115725b8a6 100644
--- a/js/data/bucket.js
+++ b/js/data/bucket.js
@@ -62,30 +62,6 @@ class Bucket {
         }
     }
 
-    /**
-     * Instantiate the appropriate subclass of `Bucket` for `options`.
-     * @param options See `Bucket` constructor options
-     * @returns {Bucket}
-     */
-    static create(options) {
-        const Classes = {
-            fill: require('./bucket/fill_bucket'),
-            fillextrusion: require('./bucket/fill_extrusion_bucket'),
-            line: require('./bucket/line_bucket'),
-            circle: require('./bucket/circle_bucket'),
-            symbol: require('./bucket/symbol_bucket')
-        };
-
-        let type = options.layer.type;
-        if (type === 'fill' && (!options.layer.isPaintValueFeatureConstant('fill-extrude-height') ||
-            !options.layer.isPaintValueZoomConstant('fill-extrude-height') ||
-            options.layer.getPaintValue('fill-extrude-height') !== 0)) {
-            type = 'fillextrusion';
-        }
-
-        return new Classes[type](options);
-    }
-
     populate(features) {
         this.createArrays();
         this.recalculateStyleLayers();
@@ -289,6 +265,29 @@ Bucket.ElementArrayType = function (components) {
 
 module.exports = Bucket;
 
+const subclasses = {
+    fill: require('./bucket/fill_bucket'),
+    fillextrusion: require('./bucket/fill_extrusion_bucket'),
+    line: require('./bucket/line_bucket'),
+    circle: require('./bucket/circle_bucket'),
+    symbol: require('./bucket/symbol_bucket')
+};
+
+/**
+ * Instantiate the appropriate subclass of `Bucket` for `options`.
+ * @param options See `Bucket` constructor options
+ * @returns {Bucket}
+ */
+Bucket.create = function(options) {
+    let type = options.layer.type;
+    if (type === 'fill' && (!options.layer.isPaintValueFeatureConstant('fill-extrude-height') ||
+        !options.layer.isPaintValueZoomConstant('fill-extrude-height') ||
+        options.layer.getPaintValue('fill-extrude-height') !== 0)) {
+        type = 'fillextrusion';
+    }
+    return new subclasses[type](options);
+};
+
 function createPaintAttributes(bucket) {
     const attributes = {};
     for (const interfaceName in bucket.programInterfaces) {
diff --git a/js/style/style_layer.js b/js/style/style_layer.js
index 3558ec8de80..c9f45d9001c 100644
--- a/js/style/style_layer.js
+++ b/js/style/style_layer.js
@@ -10,28 +10,12 @@ const Evented = require('../util/evented');
 
 const TRANSITION_SUFFIX = '-transition';
 
-// false-positive prefer-const eslint violation here; we intentionally assign once but later
-let FillStyleLayer, LineStyleLayer, SymbolStyleLayer; // eslint-disable-line
-
 class StyleLayer extends Evented {
     constructor(layer, refLayer) {
         super();
         this.set(layer, refLayer);
     }
 
-    static create(layer, refLayer) {
-        switch ((refLayer || layer).type) {
-        case 'fill':
-            return new FillStyleLayer(layer, refLayer);
-        case 'line':
-            return new LineStyleLayer(layer, refLayer);
-        case 'symbol':
-            return new SymbolStyleLayer(layer, refLayer);
-        default:
-            return new StyleLayer(layer, refLayer);
-        }
-    }
-
     set(layer, refLayer) {
         this.id = layer.id;
         this.ref = layer.ref;
@@ -347,9 +331,16 @@ class StyleLayer extends Evented {
 
 module.exports = StyleLayer;
 
-FillStyleLayer = require('./style_layer/fill_style_layer');
-LineStyleLayer = require('./style_layer/line_style_layer');
-SymbolStyleLayer = require('./style_layer/symbol_style_layer');
+const subclasses = {
+    'fill': require('./style_layer/fill_style_layer'),
+    'line': require('./style_layer/line_style_layer'),
+    'symbol': require('./style_layer/symbol_style_layer')
+};
+
+StyleLayer.create = function(layer, refLayer) {
+    const LayerClass = subclasses[(refLayer || layer).type] || StyleLayer;
+    return new LayerClass(layer, refLayer);
+};
 
 function getDeclarationValue(declaration) {
     return declaration.value;