commit 7562eebe6ed9173a1e1018e80a8cf0f5f3ade7d2
Author: Nicolas Meyer <nicolas@commerceguys.com>
Date:   Fri Apr 27 10:52:57 2012 +0200

    allow commerce_flat_rate to be exported in commerce_features

diff --git a/commerce_features.module b/commerce_features.module
index bb74d7d..d541a65 100644
--- a/commerce_features.module
+++ b/commerce_features.module
@@ -42,6 +42,14 @@ function commerce_features_features_api() {
       'file' => drupal_get_path('module', 'commerce_features') . '/commerce_line_item_type.features.inc',
     );
   }
+  if (module_exists('commerce_flat_rate'))  {
+    $features['commerce_flat_rate_services'] = array(
+      'name' => t('Commerce flat rate services'),
+      'features_source' => TRUE,
+      'default_hook' => 'commerce_flat_rate_default_services',
+      'file' => drupal_get_path('module', 'commerce_features') . '/commerce_flat_rate_services.features.inc',
+    );
+  }
 
   return $features;
 }
diff --git a/commerce_flat_rate_services.features.inc b/commerce_flat_rate_services.features.inc
new file mode 100644
index 0000000..f11515c
--- /dev/null
+++ b/commerce_flat_rate_services.features.inc
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Implements hook_features_export().
+ */
+function commerce_flat_rate_services_features_export($data, &$export, $module_name = '') {
+  $pipe = array();
+
+  $export['dependencies']['features'] = 'features';
+  $export['dependencies']['commerce_features'] = 'commerce_features';
+  $export['dependencies']['commerce_flat_rate'] = 'commerce_flat_rate';
+  $export['dependencies']['rules'] = 'rules';
+
+  // Get the list of the commerce rates and export them plus the rules
+  // component which is related.
+  $info = commerce_shipping_services('flat_rate');
+  foreach ($data as $service) {
+    if (isset($info[$service]['module'])) {
+      $export['dependencies'][$info[$service]['module']] = $info[$service]['module'];
+    }
+    $export['features']['commerce_flat_rate_services'][$service] = $service;
+    $export['features']['rules_config']['commerce_flat_rate_services_' . $service] = 'commerce_flat_rate_services_' . $service;
+  }
+  return $pipe;
+}
+
+/**
+ * Implements hook_features_export_options().
+ */
+function commerce_flat_rate_services_features_export_options() {
+  $feature_types = array();
+  $flat_rate_services = commerce_shipping_services('flat_rate');
+  if (!empty($flat_rate_services)) {
+    foreach ($flat_rate_services as $service) {
+      $feature_types[$service['name']] = $service['display_title'];
+    }
+  }
+  return $feature_types;
+}
+
+/**
+ * Implements hook_features_export_render().
+ */
+function commerce_flat_rate_services_features_export_render($module, $data, $export = NULL) {
+  $info = commerce_shipping_services('flat_rate');
+
+  $output = array();
+  $output[] = '  $items = array(';
+  foreach ($data as $service) {
+    if (isset($info[$service]) && $flat_rate_service = $info[$service]) {
+      $output[] = "    '{$service}' => " . features_var_export($flat_rate_service, '    ') . ",";
+    }
+
+  }
+  $output[] = '  );';
+  $output[] = '  return $items;';
+  $output = implode("\n", $output);
+  return array('commerce_flat_rate_default_services' => $output);
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function commerce_flat_rate_services_features_revert($module = NULL) {
+  // Get default flat rate services
+
+  if (module_hook($module, 'commerce_flat_rate_default_services')) {
+    $default_types = module_invoke($module, 'commerce_flat_rate_default_services');
+    $existing_types = commerce_shipping_services('flat_rate');
+    foreach ($default_types as $type) {
+      // Add / or update
+      if (!isset($existing_types[$type['name']])) {
+        $type['is_new'] = TRUE;
+      }
+      // Maybe not the good way ?
+      commerce_flat_rate_service_save($type);
+    }
+  }
+  else {
+    drupal_set_message(t('Could not load default flat rate services.'), 'error');
+    return FALSE;
+  }
+
+  // Re-Cache
+  drupal_static_reset('commerce_shipping_services');
+
+  menu_rebuild();
+  return TRUE;
+}
+
+/**
+ * Implements hook_features_rebuild().
+ */
+function commerce_flat_rate_services_features_rebuild($module) {
+  return commerce_flat_rate_services_features_revert($module);
+}
