When can I, and when I can't rely on other module's classes to be loaded? I'm writing pluggable system. For a given name, I want to test if there is defined class pluginActionName. If it is, I want to create an instance of it. If it's not, I want to create an instance of pluginAction (parent class for all pluginAction* classes). That's the easy part, and Drupal unrelated.

Difficult about Drupal is to know when classes are defined. Can I rely on class_exists


in my .inc code outside actual class? no?
in initializers for static properties? no?
in static methods of my class? sometimes?
in dynamic methods of my class? yes?
in helper functions that will be called by methods? only if it would be OK in method?


In italics is what I figured out so far, but I'm not sure about this and I cannot figure out exact loading order to tell why it's the way it is reliably.
Drupal 7 introduces a code registry - an inventory of all classes and
  interfaces for all enabled modules and Drupal's core files. The
  registry stores the path to the file a given class or interface is
  defined in, and loads the the file when necessary. The registry loads
  classes and interfaces on demand, via php's built in class autoloading
  mechanism. Modules can now move all code for classes that are not
  regularly used into an include file, and Drupal will only load it on
  demand. This will cut down on the amount of code loaded per request,
  and reduce Drupal's memory footprint.


more info: 


http://api.drupal.org/api/drupal/includes%21registry.inc/group/registry/7
http://drupal.org/node/350780
http://drupal.org/node/542202#files
http://php.net/manual/en/language.oop5.autoload.php