Depends on if you want to ensure a class relationship or not. I would say containing classes in other modules is bad design, and soon you'll end up creating dependency loops. I would only ever contain a class that's in the same module, a common pattern would be:
class drupal {
contain drupal::config
contain drupal::install
Class[drupal::install] -> Class[drupal::config]
}
To comment on the original poster's problem, if Class[My_drupal_class] is creating Class[Apache] using the resource like syntax, then Class[My_drupal_class] is not designed very well. In practice Drupal does not depend on Apache. It's a set of PHP files and a MySQL database, and it may or may not have Apache serve it's PHP (it could be another web server). If Class[My_drupal_class] is intended to be used under Apache, then it should create it's own Apache::Vhost resource (assuming Puppetlabs' Apache module) and that's it. Then somewhere else in your manifest, you will instantiate Class[Apache] with all the settings you want. This way you could even run other Apache services on the same Drupal machine, or, move Drupal to any other Apache server. Here's a sketch of a role/profile approach I would use:
class role::mywebserver {
class { 'apache':
all my options...
}
contain profile::drupal
contain profile::some_other_apache_service
Class[apache] -> Class[profile::drupal]
}
class profile::drupal {
class { 'my_drupal_class':
option => 'something',
parameter => 'something else',
woof => 'meow',
}
apache::vhost { 'my_drupal_vhost':
listen => 80,
docroot => '/opt/drupal',
otherparams => 'I can't remember',
}
}
In the above, profile::drupal is portable to any other role / node.