**_Note:** This answer is just here to make discussion between @scribu and @kaiser easier. Mods: Please don't delete. Users/Readers: Please don't vote. If you want to follow the discussion, take a look at the revision/edit log. If you want to join the discussion, edit the Answer. If the discussion has a result, then it will be marked as such. Thank you._

----------

<h3>Scenarios</h3>
There are also different scenarios that weight different, where you could have a plugin dependency. (The examples are only fictional). The word "(parent) Plugin" can be exchanged with "Theme" from parent point of view.

1. (hard) A child plugin that only extends the functionality or alters the display (and similar) of an existing plugin and therefore can't exist without the parent. _Example:_ BuddyPress » BuddyPress-FunkyCommentDisplay
2. (normal) A plugin that has extended functionality when a child plugin is activated. _Example:_ jQueryAttachmentCarousel » jQuerySlideDeck
3. (soft) A plugin that just adds a feature. _Example:_ DisneyWonderlandTheme » MickeysSocialLinks

In the following I try to sketch what happens when you update the "other" plugin and the check doesn't work anymore.

* Ad 1) The plugin couldn't exist without BuddyPress activated » Stuff is completely broken.
* Ad 2) The plugin couldn't offer the option to switch from Carousel to SlideDeck » Displays wired (I assume that styles are modified to SlideDeck).
* Ad 3) MickeysSocialLinks disappear.

<h3>Check</h3>
There are imho three possibilities to check against, if you want to know if a plugin is active:

* A. Does the folder exist?
* B. Does the main file - option `'active_plugins'` - exist?
* C. Does a particular function exist?

If I now take my [Internal Link Checker Plugin](http://wordpress.org/extend/plugins/internal-link-checker/) as an example, that offers no public API and isn't meant to get extended, then I'd see no reason (as author) to not change internal function naming on demand or just on will. So if someone would try to piggyback on this plugin, then stuff would simply break (depending on functionality and tightness of bundling) on update. The same goes for file names. I'd have no real reason (aside from that the plugin would get deactivated on update) to not change the filename. The only thing that would hold me back from changing the folder name is that the update check & notification runs against the file name - if it's hosted in the official repo.

So I'd say from weakest (easy to change) to toughest (a lot speak against changing) part of a (parent) plugin would be:

function » main file name » folder

----

When I said that a function check is less fragile than using `is_plugin_active()` I assumed that the function in question is one that the plugin author explicitly encourages. The ultimate example of this would be the `wp_pagenavi()` template tag offered by the WP-PageNavi plugin.

The difficulty in defining dependencies is that there's no standard way to uniquely identify plugins that doesn't involve file names.

More thoughts on the subject:

http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme

----------

**I guess we can so far sum it up in three points:**

* We have talked about slightly different topics
* We agree that there's no bulletproof way to get around what I thought the topic would be
* From your understanding of the question, you offered on valid way to go

The (so far) smartest way I can think off, that I've already seen in some (much too less) plugins:

    // inside the plugin file:
    add_action( 'plugin_custom_hook', 'plugin_trigger' );
    // inside some template:
    do_action( 'plugin_custom_hook' );

Without thinking too much in detail about it, but I guess you could hook your notice into a check on 'all' filter and check inside [current filter][1] if it was triggered when you are on the `shutdown` hook...?

----

Using hooks would works well for 'normal' and 'weak' dependencies. The only drawback is that you would still need to use `function_exists()` or `is_plugin_active()` if you want to stop if the dependency is not met. Using the 'all' filter for that would be too expensive IMO.

  [1]: http://codex.wordpress.org/Function_Reference/current_filter