autorequire:
   - objects defined in type manifests should be automatically prerequisites of the current object
   - __foo/some-id
      __other other-id --state present
      => require="__other/other-id" __foo/some-id


metaparameters:
   - steal the metaparameters from puppet:

   # I have to be there before the other one
   __directory /etc/ssh \
      --before __file/etc/ssh/sshd_config

   # the other one has to be there before me
   __file /etc/ssh/sshd_config \
      --after __directory/etc/ssh

   # if I change, tell the other one about it
   __file /etc/ssh/sshd_config \
      --notify __init_script/etc/rc.d/sshd

   # whenever the other one changes, I want to know
   __init_script /etc/rc.d/sshd \
      --subscribe __file/etc/ssh/sshd_config

   - how does a type react to a received 'event'?
      - maybe something like:
         __some_type/
            manifest
            ...
            gencode-refresh
            ...
      - gencode-refresh -> code-refresh -> ssh $target sh -e code-refresh
   



logging:
   - logging from type emulator without clobbering stdout
      maybe implement logging server as described here [1]
   [1] http://docs.python.org/py3k/howto/logging-cookbook.html#configuration-server-example

   - use different logger to limit output to current area of interest,
      e.g.
         explorer.$target_host: explorer related messages for the run for $target_host
         manifest.$target_host: manifest related messages for the run for $target_host
         ...
      then one could filter e.g. on explorer.*

   - more granular debug output,
   [2] http://blog.ooz.ie/2011/03/python-logging-extending-standard.html



tests:

   __init__():
      - sets up env: __target_host

   run_initial_manifest():
      - parameter is actually used (from __init__)
      - ensure changing the manifest actually runs a different manifest
      -> give ConfigInstall Constructor different manifest
         -> different manifest is executed.
      - test all submitted (from core to type manifest) variables:
         - ENVIRONMENT
         - they are set
         - they contain the correct values

   run_type_manifest():
      - test all submitted (from core to type manifest) variables:
         - ENVIRONMENT
         - they are set
         - they contain the correct values
      - same tests as for test_initial_manifest_*?

   run_manifest():
      - test all submitted variables:
         - ENVIRONMENT
            - including __debug, if debug
         - they are set
         - they contain the correct values
      - does $require work?
      - check that exception raised, if manifest is not existent

   object_run():
      - ensure no object is run twice
      - ensure requirements are taken into account?
         - and order of run is adjusted
      - check (from extern?) that all needed variables are setup
      - ensure no code-{local, remote} is created, 
         if gencode is not producing code
      - ensure THAT code-{local, remote} contains what gencode created
      - abort if gencode-* fails
      - abort if code-* fails
         - abort == raise(FooException)
      - gencode-*: ensure ENVIRONMENT is setup correctly

   run_type_explorer()
      - ensure ALL type explores have been run
      - ensure output is saved to correct path
      - ensure a type with {0,1,2} explorers works ?
         - none, one, multiple
      - ensure ENVIRONMENT is setup correctly
      - fails if ANY of the given explorer fails

   run_global_explorers():
      - ensure ALL type explores have been run
      - ensure output is saved to correct path
      - ensure a type with {0,1,2} explorers works ?
         - none, one, multiple
      - ensure ENVIRONMENT is setup correctly
      - fails if ANY of the given explorer fails
      
Code fixes needed:

   - shutil, os.mkdir, etc. everywhere: catch/reraise exceptions correctly
