/**
  * Gets an array of classes and their corresponding definition files, or examines a file and
  * returns the classes it defines.
  *
  * @param array $options
  * @return array Associative of classes and their corresponding definition files
  * @todo Document valid options
  */
 public static function classes($options = array())
 {
     $defaults = array('group' => 'classes', 'file' => null);
     $options += $defaults;
     $list = get_declared_classes();
     $classes = array();
     if (!empty($options['file'])) {
         $loaded = new Collection(array('items' => array_map(function ($class) {
             return new ReflectionClass($class);
         }, $list)));
         if (!in_array($options['file'], $loaded->getFileName())) {
             include $options['file'];
             $list = array_diff(get_declared_classes(), $list);
         } else {
             $file = $options['file'];
             $filter = function ($class) use($file) {
                 return $class->getFileName() == $file;
             };
             $list = $loaded->find($filter)->getName();
         }
     }
     foreach ($list as $class) {
         $inspector = new ReflectionClass($class);
         if ($options['group'] == 'classes') {
             $inspector->getFileName() ? $classes[$class] = $inspector->getFileName() : null;
         } elseif ($options['group'] == 'files') {
             $classes[$inspector->getFileName()][] = $inspector;
         }
     }
     return $classes;
 }