--- ad.module	Fri Jan 16 04:26:28 1970
+++ ad.module	Fri Jan 16 04:26:28 1970
@@ -574,25 +574,53 @@
 
 /**
  * Implementation of hook_access().
  */
 function ad_access($op, $node, $account) {
+  $original_result = null;
   switch ($op) {
     case 'create':
-      return (user_access('create advertisements', $account) || user_access('administer advertisements'));
+      $original_result = (user_access('create advertisements', $account) || user_access('administer advertisements'));
+      break;
     case 'update':
-      return (user_access('edit any advertisement', $account) || (user_access('edit own advertisements', $account) && is_ad_owner($node->nid)) || user_access('administer advertisements', $account));
+      $original_result = (user_access('edit any advertisement', $account) || (user_access('edit own advertisements', $account) && is_ad_owner($node->nid)) || user_access('administer advertisements', $account));
+      break;
     case 'delete':
-      return (user_access('delete any advertisement', $account) || (user_access('delete own advertisements', $account) && is_ad_owner($node->nid)) || user_access('administer advertisements', $account));
+      $original_result = (user_access('delete any advertisement', $account) || (user_access('delete own advertisements', $account) && is_ad_owner($node->nid)) || user_access('administer advertisements', $account));
+      break;
     case 'view':
       // Return false if user doesn't have basic permissions to view
       // advertisements.  Don't return true to let default Drupal
       // domain/node access checks happen.
       if (!user_access('show advertisements', $account) &&
           !user_access('administer advertisements', $account)) {
-        return false;
+        $original_result = false;
       }
+      break;
+  }
+  $access_modules = module_implements('ad_overwrite_access');
+
+  if(count($access_modules)) { // Check if we have to override default behaviour
+    $results = module_invoke_all('ad_overwrite_access', $original_result, $op, $node, $account);
+    $results = array_unique($results);
+    switch(count($results)) { 
+      case 0: //No hook intervened
+        return $original_result;
+        break;
+      case 1: //One hook worked, or hooks were consistent - we're good
+        return $results[0];
+        break;
+      default: //More than one hook result, need to apply logic
+        if (is_null($original_result) || in_array(null, $results, true)) { //If any module wants to decide later, decide later
+          return null;
+        } else { //If modules argue, leave as it was
+          return $original_result;
+        }
+      break;
+    }
+  } else { // No modules want to interfere, return what was.
+    return $original_result;
   }
 }
 
 /**
  * Implementation of hook_form().
