--- ucreate-old.module	2010-07-14 10:49:51.000000000 -0400
+++ ucreate.module	2010-08-30 13:19:32.000000000 -0400
@@ -63,7 +63,18 @@ function ucreate_menu() {
  * Implementation of hook_perm().
  */
 function ucreate_perm() {
-  return array('create users', 'block users', 'assign user roles');
+  // Some default permissions.
+  $permissions = array('create users', 'block users', 'assign any user role');
+  
+  // Now create a permission per role.
+  $roles = user_roles(TRUE);
+  foreach ($roles as $rid => $role) {
+    // Authenticated should always be possible.
+    if ($rid !== 1 && $rid !== 2) {
+      $permissions[] = 'assign user role '. check_plain($role);
+    }
+  }
+  return $permissions;
 }
 
 /**
@@ -130,23 +141,27 @@ function ucreate_user_form() {
     '#title' => t('E-mail (confirm)'),
     '#required' => TRUE,
     );
-  if (user_access('assign user roles') || user_access('administer users')) {
-    $form['roles'] = array(
+    
+  // First, build the set of roles they should be able to grant.
+  $default_roles = variable_get('ucreate_default_roles', array());
+  foreach (user_roles() as $rid => $role) {
+    // Exclude 'anonymous user'
+    if ($rid !== 1 && (user_access('assign the role '. check_plain($role)) || user_access('assign user roles') || user_access('administer users'))) {
+      $form['roles'][$rid] = array(
+        '#title' => $role,
+        '#type' => 'checkbox',
+        '#default_value' => in_array($rid, $default_roles, TRUE) || $rid === 2,
+        '#disabled' => $rid === 2 ? TRUE : FALSE,
+      );
+    }
+  }
+  
+  // If they can create some specific roles, let them see it.
+  if (isset($form['roles'])) {
+    $form['roles'] += array(
       '#type' => 'checkboxes',
       '#title' => t('User roles'),
     );
-    $default_roles = variable_get('ucreate_default_roles', array());
-    foreach (user_roles() as $rid => $role) {
-      // Exclude 'anonymous user'
-      if ($rid !== 1) {
-        $form['roles'][$rid] = array(
-          '#title' => $role,
-          '#type' => 'checkbox',
-          '#default_value' => in_array($rid, $default_roles, TRUE) || $rid === 2,
-          '#disabled' => $rid === 2 ? TRUE : FALSE,
-        );
-      }
-    }
   }
   else {
     $form['roles'] = array(
