fix up value retrieval
diff --git a/lib/build/initializer_plugin.dart b/lib/build/initializer_plugin.dart
index ba3099a..efca427 100644
--- a/lib/build/initializer_plugin.dart
+++ b/lib/build/initializer_plugin.dart
@@ -4,6 +4,7 @@
 library initialize.build.initializer_plugin;
 
 import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:barback/barback.dart';
 import 'package:code_transformers/resolver.dart';
@@ -58,10 +59,8 @@
   /// [ElementAnnotation] that was found.
   String buildMeta(InitializerPluginData pluginData) {
     var logger = pluginData.logger;
-    var element = pluginData.initializer.targetElement;
     var elementAnnotation = pluginData.initializer.annotationElement;
     var elementAnnotationElement = elementAnnotation.element;
-    var libraryPrefixes = pluginData.libraryPrefixes;
     if (elementAnnotationElement is ConstructorElement) {
       return buildConstructorMeta(elementAnnotation, pluginData);
     } else if (elementAnnotationElement is PropertyAccessorElement) {
@@ -275,16 +274,7 @@
       return null;
     }
 
-    var value = result.value.toStringValue();
-    if (value != null) value = _stringValue(value);
-
-    if (value == null) value = result.value.toBoolValue();
-    if (value == null) value = result.value.toIntValue();
-    if (value == null) value = result.value.toDoubleValue();
-    if (value == null) value = result.value.toListValue();
-    if (value == null) value = result.value.toMapValue();
-    if (value == null) value = result.value.toSymbolValue();
-    if (value == null) value = result.value.toTypeValue();
+    var value = _getValue(result.value);
 
     if (value == null) {
       logger.error('Unsupported expression in initializer, found '
@@ -292,6 +282,8 @@
           'https://github.com/dart-lang/initialize/issues');
     }
 
+    if (value is String) value = _stringValue(value);
+
     return value;
   }
 
@@ -301,4 +293,31 @@
     value = value.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'");
     return "'$value'";
   }
+
+  // Gets an actual value for a [DartObject].
+  _getValue(DartObject object) {
+    if (object == null) return null;
+    var value = object.toBoolValue() ??
+        object.toDoubleValue() ??
+        object.toIntValue() ??
+        object.toStringValue();
+    if (value == null) {
+      value = object.toListValue();
+      if (value != null) {
+        return value.map((DartObject element) => _getValue(element)).toList();
+      }
+      Map<DartObject, DartObject> map = object.toMapValue();
+      if (map != null) {
+        Map result = {};
+        map.forEach((DartObject key, DartObject value) {
+          dynamic mappedKey = _getValue(key);
+          if (mappedKey != null) {
+            result[mappedKey] = _getValue(value);
+          }
+        });
+        return result;
+      }
+    }
+    return value;
+  }
 }