diff --git advpoll.module advpoll.module
index 80fb369..ef36ed0 100644
--- advpoll.module
+++ advpoll.module
@@ -65,16 +65,20 @@ function advpoll_access($op, $node, $account) {
  * Implementation of hook_node_info().
  */
 function advpoll_node_info() {
-  $modes = _advpoll_list_modes();
-  $info = array();
-  foreach ($modes as $mode) {
-    $info['advpoll_'. $mode['name']] = array(
-      'name' => t('@name poll', array('@name' => $mode['name_label'])),
-      'module' => 'advpoll',
-      'description' => $mode['description'],
-      'title_label' => t('@name question', array('@name' => $mode['name_label'])),
-      'body_label' => t('Description'),
-    );
+  static $info;
+  if (!isset($info)) {
+    $info = array();
+    $modes = _advpoll_list_modes();
+    $info = array();
+    foreach ($modes as $mode) {
+      $info['advpoll_'. $mode['name']] = array(
+        'name' => t('@name poll', array('@name' => $mode['name_label'])),
+        'module' => 'advpoll',
+        'description' => $mode['description'],
+        'title_label' => t('@name question', array('@name' => $mode['name_label'])),
+        'body_label' => t('Description'),
+      );
+    }
   }
   return $info;
 }
@@ -205,35 +209,35 @@ function advpoll_init() {
  * Results access callback.
  */
 function _advpoll_results_access($node) {
-  return strstr($node->type, 'advpoll_') && _advpoll_is_active($node) && $node->votes > 0 && !$node->voted && _advpoll_can_view_results($node);
+  return in_array($node->type, array_keys(advpoll_node_info())) && _advpoll_is_active($node) && $node->votes > 0 && !$node->voted && _advpoll_can_view_results($node);
 }
 
 /**
  * Electorial list access callback.
  */
 function _advpoll_electoral_list_access($node) {
-  return user_access('access electoral list') && strstr($node->type, 'advpoll_') &&  $node->use_list;
+  return user_access('access electoral list') && in_array($node->type, array_keys(advpoll_node_info())) &&  $node->use_list;
 }
 
 /**
  * Votes access callback.
  */
 function _advpoll_votes_access($node) {
-  return strstr($node->type, 'advpoll_') && $node->votes > 0 && ((user_access('inspect all votes') && $node->show_votes) || user_access('administer polls'));
+  return in_array($node->type, array_keys(advpoll_node_info())) && $node->votes > 0 && ((user_access('inspect all votes') && $node->show_votes) || user_access('administer polls'));
 }
 
 /**
  * Clear votes access callback.
  */
 function _advpoll_clear_votes_access($node) {
-  return strstr($node->type, 'advpoll_') && $node->votes > 0 && user_access('administer polls');
+  return in_array($node->type, array_keys(advpoll_node_info())) && $node->votes > 0 && user_access('administer polls');
 }
 
 /**
  * Writeins access callback.
  */
 function _advpoll_writeins_access($node) {
-  if (!strstr($node->type, 'advpoll_') || !user_access('administer polls')) {
+  if (!in_array($node->type, array_keys(advpoll_node_info())) || !user_access('administer polls')) {
     return FALSE;
   }
 
