4.6.x module.inc module_implements($hook)
4.7.x module.inc module_implements($hook, $sort = FALSE)
5.x module.inc module_implements($hook, $sort = FALSE, $refresh = FALSE)
6.x module.inc module_implements($hook, $sort = FALSE, $refresh = FALSE)
7.x module.inc module_implements($hook, $sort = FALSE, $reset = FALSE)

Determine which modules are implementing a hook.


$hook: The name of the hook (e.g. "help" or "menu").

$sort: By default, modules are ordered by weight and filename, settings this option to TRUE, module list will be ordered by module name.

$refresh: For internal use only: Whether to force the stored list of hook implementations to be regenerated (such as after enabling a new module, before processing hook_enable).

Return value

An array with the names of the modules which are implementing this hook.

Related topics

3 calls to module_implements()
module_disable in includes/module.inc
Disable a given set of modules.
module_enable in includes/module.inc
Enable a given list of modules.
system_performance_settings in modules/system/system.module


includes/module.inc, line 340
API for loading and interacting with Drupal modules.


function module_implements($hook, $sort = FALSE, $refresh = FALSE) {
  static $implementations;
  if ($refresh) {
    $implementations = array();
  if (!isset($implementations[$hook])) {
    $implementations[$hook] = array();
    $list = module_list(FALSE, TRUE, $sort);
    foreach ($list as $module) {
      if (module_hook($module, $hook)) {
        $implementations[$hook][] = $module;

  // The explicit cast forces a copy to be made. This is needed because
  // $implementations[$hook] is only a reference to an element of
  // $implementations and if there are nested foreaches (due to nested node
  // API calls, for example), they would both manipulate the same array's
  // references, which causes some modules' hooks not to be called.
  // See also http://www.zend.com/zend/art/ref-count.php.
  return (array) $implementations[$hook];