Index: skinr.api.php
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/skinr.api.php,v
retrieving revision 1.1
diff -u -p -r1.1 skinr.api.php
--- skinr.api.php	17 Dec 2010 22:15:24 -0000	1.1
+++ skinr.api.php	3 Jan 2011 22:21:29 -0000
@@ -96,12 +96,17 @@ function hook_skinr_config() {
  * Register Skinr API information. This is required for your module to have
  * its include files loaded.
  *
+ * @return
+ *   An array of Skinr API compatibility information with the following keys
+ *   - 'api': A string specifying the Skinr API version, required.
+ *   - 'type': A string specifying the type of plugin being implmented,
+ *     optional, defaults to 'skin'.
  * The full documentation for this hook is in the advanced help.
  */
 function hook_skinr_api() {
   return array(
-    'api' => 1,
-    'path' => drupal_get_path('module', 'modulename'),
+    'api' => '2.0',
+    'type' => 'skin',
   );
 }
 
Index: skinr.handlers.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/skinr.handlers.inc,v
retrieving revision 1.9
diff -u -p -r1.9 skinr.handlers.inc
--- skinr.handlers.inc	20 Dec 2010 21:42:29 -0000	1.9
+++ skinr.handlers.inc	3 Jan 2011 22:21:29 -0000
@@ -139,27 +139,3 @@ function skinr_submit_handler(&$form, $f
     }
   }
 }
-
-// Declare API compatibility on behalf of core modules:
-
-/**
- * Implements hook_skinr_api().
- *
- * This one is used as the base to reduce errors when updating.
- */
-function skinr_skinr_api() {
-  return array(
-    'api' => 1,
-    'path' => drupal_get_path('module', 'skinr') . '/modules',
-  );
-}
-
-function block_skinr_api() { return skinr_skinr_api(); }
-
-function comment_skinr_api() { return skinr_skinr_api(); }
-
-function node_skinr_api() { return skinr_skinr_api(); }
-
-function panels_skinr_api() { return skinr_skinr_api(); }
-
-function views_skinr_api() { return skinr_skinr_api(); }
Index: skinr.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/skinr.module,v
retrieving revision 1.37
diff -u -p -r1.37 skinr.module
--- skinr.module	20 Dec 2010 21:42:29 -0000	1.37
+++ skinr.module	3 Jan 2011 22:21:29 -0000
@@ -7,6 +7,13 @@
  */
 
 /**
+ * Define the current Skinr API version.
+ */
+function skinr_api_version() {
+  return '2.0';
+}
+
+/**
  * Implements hook_help().
  */
 function skinr_help($path, $arg) {
@@ -38,8 +45,10 @@ function skinr_module_implements_alter(&
  * Implements hook_init().
  */
 function skinr_init() {
+  // Load Skinr handlers include.
   module_load_include('inc', 'skinr', 'skinr.handlers');
-  skinr_module_load_all_includes();
+  // Load module and skin plugins.
+  skinr_load_includes();
 }
 
 /**
@@ -421,38 +430,50 @@ function skinr_rule_visible($rid) {
 // Include file helpers.
 
 /**
- * Includes $module.skinr.inc files.
- */
-function skinr_module_load_all_includes() {
-  foreach (skinr_get_module_apis() as $module => $info) {
-    $file = DRUPAL_ROOT . "/$info[path]/$module.skinr.inc";
-    if (is_file($file)) {
-      require_once $file;
-    }
-  }
-}
-
-/**
- * Get a list of modules that support skinr.
+ * Load module and skin plugin include files for Skinr.
+ *
+ * @return
+ *   An array of hook details keyed by plugin type and name. The hook details
+ *   contain the following keys:
+ *   - 'type': Available options are 'module' or 'skin'.
+ *   - 'filename': The filename of the plugin.
+ *   - 'name': The name of the plugin.
+ *   - 'path': This plugin's path.
  */
-function skinr_get_module_apis() {
-  $cache = &drupal_static(__FUNCTION__);
-
-  if (!isset($cache)) {
-    $cache = array();
-    foreach (module_implements('skinr_api') as $module) {
-      $function = $module . '_skinr_api';
-      $info = $function();
-      if (isset($info['api']) && $info['api'] == 1.000) {
-        if (!isset($info['path'])) {
-          $info['path'] = drupal_get_path('module', $module);
+function skinr_load_includes() {
+  // Store hooks statically because the files can't be reincluded, so there's
+  // no use in being able to clear it.
+  $plugins = &drupal_static(__FUNCTION__);
+
+  if (!isset($plugins)) {
+    // Get a list of Skinr plugin files.
+    $files = drupal_system_listing("/\.skinr\.inc\$/", 'sites', 'name', 0);
+
+    // Load plugins and check API compatibility.
+    foreach ($files as $file) {
+      // Strip off the Skinr file format to get the plugin name.
+      $plugin = substr($file->name, 0, strpos($file->name, '.'));
+      // Include the plugin.
+      include_once './' . $file->uri;
+      // Check API compatibility.
+      $function = $plugin . '_skinr_api';
+      if (function_exists($function)) {
+        $info = $function();
+        if (isset($info['api']) && $info['api'] == skinr_api_version()) {
+          $type = isset($info['type']) ? $info['type'] : 'skin';
+          // Plugin is compatible so include it.
+          $plugins[$type][$plugin] = array(
+            'type' => $type,
+            'filename' => $file->filename,
+            'name' => $plugin,
+            'path' => dirname($file->uri),
+          );
         }
-        $cache[$module] = $info;
       }
     }
   }
 
-  return $cache;
+  return $plugins;
 }
 
 // -----------------------------------------------------------------------
@@ -758,24 +779,6 @@ function skinr_skin_info_status_default(
 }
 
 /**
- * Get a list of plugin hooks.
- *
- * @return
- *   An array of hook details keyed by hook name. The hook details contain the
- *   following keys:
- *   - 'type': Available options are 'module' or 'theme'.
- *   - 'name': The name of the owner module or theme of this plugin.
- *   - 'plugin': The name of the skins plugin.
- *   - 'path': This plugin's path.
- */
-function skinr_plugin_hooks() {
-  // @todo Load the include files and get an array of hooks; we need to
-  //   know which module and which plugin comprises the hook.
-  $hooks = array();
-  return $hooks;
-}
-
-/**
  * Helper function to prepend a path to an array of stylesheet or script filenames.
  *
  * If the url is absolute (e.g. the url start with 'http://' or 'https://')
@@ -880,20 +883,25 @@ function skinr_get_skin_info() {
     // are found.
     $skin_infos = array();
 
-    // Load skins from hook_skinr_skins().
-    $hooks = skinr_plugin_hooks();
-    foreach ($hooks as $hook => $source) {
-      $function = $hook . '_skinr_skin_info';
-      $result = $function();
-      if (isset($result)) {
-        if (!is_array($result)) {
-          $result = array($result);
+    // Load skins from plugins.
+    $plugins = skinr_load_includes();
+    if (isset($plugins['skin'])) {
+      $skins = $plugins['skin'];
+      foreach ($skins as $name => $plugin) {
+        $function = $name . '_skinr_skin_info';
+        if (function_exists($function)) {
+          $result = $function();
+          if (isset($result)) {
+            if (!is_array($result)) {
+              $result = array($result);
+            }
+    
+            // Make any programatic changes.
+            skinr_skin_info_process($result, $plugin);
+    
+            $skin_infos = array_merge_recursive($skin_infos, $result);
+          }
         }
-
-        // Make any programatic changes.
-        skinr_skin_info_process($result, $source);
-
-        $skin_infos = array_merge_recursive($skin_infos, $result);
       }
     }
 
@@ -919,22 +927,27 @@ function skinr_get_group_info() {
     $group_infos = array();
 
     // Load skins from hook_skinr_groups().
-    $hooks = skinr_plugin_hooks();
-    foreach ($hooks as $hook => $source) {
-      $function = $hook . '_skinr_group_info';
-      $result = $function();
-      if (isset($result)) {
-        if (!is_array($result)) {
-          $result = array($result);
-        }
-
-        // Make any programatic changes.
-        // Merge in defaults.
-        foreach ($result as $group_name => $group_info) {
-          $result[$group_name] = array_merge(skinr_group_info_default(), $group_info);
+    $plugins = skinr_load_includes();
+    if (isset($plugins['skin'])) {
+      $skins = $plugins['skin'];
+      foreach ($skins as $name => $plugin) {
+        $function = $name . '_skinr_group_info';
+        if (function_exists($function)) {
+          $result = $function();
+          if (isset($result)) {
+            if (!is_array($result)) {
+              $result = array($result);
+            }
+    
+            // Make any programatic changes.
+            // Merge in defaults.
+            foreach ($result as $group_name => $group_info) {
+              $result[$group_name] = array_merge(skinr_group_info_default(), $group_info);
+            }
+    
+            $group_infos = array_merge_recursive($group_infos, $result);
+          }
         }
-
-        $group_infos = array_merge_recursive($group_infos, $result);
       }
     }
 
Index: skinr_ui.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/skinr_ui.module,v
retrieving revision 1.24
diff -u -p -r1.24 skinr_ui.module
--- skinr_ui.module	20 Dec 2010 21:42:29 -0000	1.24
+++ skinr_ui.module	3 Jan 2011 22:21:29 -0000
@@ -365,7 +365,9 @@ function skinr_ui_form_alter(&$form, $fo
   $config = skinr_get_config_info();
   $skin_infos = skinr_get_skin_info();
   $groups = skinr_get_group_info();
-
+  //dpm($form_id);
+//dpm($config);
+//dpm($skin_infos);
   foreach ($config as $module => $module_settings) {
     if (isset($module_settings['form'][$form_id])) {
       if (!empty($form['skinr']) && $form['skinr']['module']['#value'] !== $module) {
@@ -419,7 +421,7 @@ function skinr_ui_form_alter(&$form, $fo
 
         if (!$form_state['submitted']) {
           if ($skin = skinr_handler('data_handler', 'form', $form_settings['data_handler'], $form, $form_state, $theme->name, $module, $form_settings)) {
-            $defaults  = $skin->skins['_options'];
+            $defaults  = isset($skin->skins['options']) ? $skin->skins['options'] : '';
             $additional_default = isset($skin->skins['_additional']) ? $skin->skins['_additional'] : '';
           }
           else {
@@ -460,6 +462,8 @@ function skinr_ui_form_alter(&$form, $fo
 
         // Create individual widgets for each skin.
         foreach ($skin_infos as $skin_name => $skin_info) {
+          
+          
           // Check if this skin is disabled.
           if (empty($skin_info['status'][$theme->name])) {
             continue;
Index: modules/block.skinr.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/modules/block.skinr.inc,v
retrieving revision 1.14
diff -u -p -r1.14 block.skinr.inc
--- modules/block.skinr.inc	27 Nov 2010 23:22:27 -0000	1.14
+++ modules/block.skinr.inc	3 Jan 2011 22:21:29 -0000
@@ -12,6 +12,16 @@
  */
 
 /**
+ * Implements hook_skinr_api().
+ */
+function block_skinr_api() {
+  return array(
+    'api' => '2.0',
+    'type' => 'module',
+  );
+}
+
+/**
  * Implements hook_skinr_config_info().
  */
 function block_skinr_config_info() {
Index: modules/comment.skinr.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/modules/comment.skinr.inc,v
retrieving revision 1.11
diff -u -p -r1.11 comment.skinr.inc
--- modules/comment.skinr.inc	27 Nov 2010 23:22:27 -0000	1.11
+++ modules/comment.skinr.inc	3 Jan 2011 22:21:29 -0000
@@ -10,6 +10,16 @@
  *
  * @{
  */
+/**
+ * Implements hook_skinr_api().
+ */
+function comment_skinr_api() {
+  return array(
+    'api' => '2.0',
+    'type' => 'module',
+  );
+}
+
 
 /**
  * Implements hook_skinr_config_info().
Index: modules/node.skinr.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/modules/node.skinr.inc,v
retrieving revision 1.11
diff -u -p -r1.11 node.skinr.inc
--- modules/node.skinr.inc	27 Nov 2010 23:22:27 -0000	1.11
+++ modules/node.skinr.inc	3 Jan 2011 22:21:29 -0000
@@ -12,6 +12,16 @@
  */
 
 /**
+ * Implements hook_skinr_api().
+ */
+function node_skinr_api() {
+  return array(
+    'api' => '2.0',
+    'type' => 'module',
+  );
+}
+
+/**
  * Implements hook_skinr_config_info().
  */
 function node_skinr_config_info() {
Index: modules/panels.skinr.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/modules/panels.skinr.inc,v
retrieving revision 1.19
diff -u -p -r1.19 panels.skinr.inc
--- modules/panels.skinr.inc	20 Dec 2010 21:42:29 -0000	1.19
+++ modules/panels.skinr.inc	3 Jan 2011 22:21:29 -0000
@@ -12,6 +12,16 @@
  */
 
 /**
+ * Implements hook_skinr_api().
+ */
+function panels_skinr_api() {
+  return array(
+    'api' => '2.0',
+    'type' => 'module',
+  );
+}
+
+/**
  * Implements hook_skinr_config_info().
  */
 function panels_skinr_config_info() {
Index: modules/skinr.skinr.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/modules/skinr.skinr.inc,v
retrieving revision 1.9
diff -u -p -r1.9 skinr.skinr.inc
--- modules/skinr.skinr.inc	27 Nov 2010 23:22:27 -0000	1.9
+++ modules/skinr.skinr.inc	3 Jan 2011 22:21:29 -0000
@@ -12,6 +12,16 @@
  */
 
 /**
+ * Implements hook_skinr_api().
+ */
+function skinr_skinr_api() {
+  return array(
+    'api' => '2.0',
+    'type' => 'module',
+  );
+}
+
+/**
  * Implementation of hook_skinr_config_info().
  */
 function skinr_skinr_config_info() {
Index: modules/views.skinr.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/skinr/modules/views.skinr.inc,v
retrieving revision 1.15
diff -u -p -r1.15 views.skinr.inc
--- modules/views.skinr.inc	20 Dec 2010 21:42:29 -0000	1.15
+++ modules/views.skinr.inc	3 Jan 2011 22:21:29 -0000
@@ -13,6 +13,16 @@
  */
 
 /**
+ * Implements hook_skinr_api().
+ */
+function views_skinr_api() {
+  return array(
+    'api' => '2.0',
+    'type' => 'module',
+  );
+}
+
+/**
  * Implements hook_skinr_config_info().
  */
 function views_skinr_config_info() {
