/**
  * Builds a ModelDefinition from a class name
  * 
  * @param string $className
  * @return ModelDefinition
  */
 public function buildModel($className)
 {
     $class = new ReflectionClass($className);
     if ($class->hasMethod('getDashboardModelDefinition')) {
         $model = call_user_func(array($className, 'getDashboardModelDefinition'));
         if (!$model instanceof ModelDefinition) {
             throw new DefinitionBuilderException("'{$className}::getDashboardModelDefinition()' must return a ModelDefinition object");
         }
         return $model;
     }
     $annotations = $this->parseAnnotations($className);
     $model = new ModelDefinition();
     $model->setClassName($className);
     $loader = null;
     $classProperties = array();
     foreach ($annotations->getClassAnnotations() as $anno) {
         if ($anno instanceof \Nucleus\IService\Dashboard\Model) {
             if ($anno->loader !== null && !is_callable($anno->loader)) {
                 throw new DefinitionBuilderException("Loader '{$anno->loader}' for model '{$className}' must be callable");
             }
             $loader = $anno->loader;
         } else {
             if ($anno instanceof \Nucleus\IService\Dashboard\ModelField) {
                 // class level field definition
                 if (!$anno->property) {
                     throw new DefinitionBuilderException("Field '{$anno->name}' of model '{$className}' is missing the 'property' attribute");
                 }
                 $classProperties[$anno->property] = $anno;
             }
         }
     }
     // extract fields from class properties
     $fields = array();
     foreach ($class->getProperties() as $property) {
         $annos = $annotations->getPropertyAnnotations($property->getName());
         $anno = null;
         foreach ($annos as $a) {
             if ($a instanceof \Nucleus\IService\Dashboard\ModelField) {
                 $anno = $a;
                 break;
             }
         }
         if ($anno === null) {
             if (!isset($classProperties[$property->getName()])) {
                 continue;
             }
             $anno = $classProperties[$property->getName()];
         } else {
             $anno->property = $property->getName();
         }
         $fields[$anno->property] = $this->buildField($anno, $property, $annos);
     }
     // adds fields from the class level annotations
     foreach ($classProperties as $property => $anno) {
         if (!isset($fields[$property])) {
             $fields[$property] = $this->buildField($anno);
         }
     }
     foreach ($annotations->getAllMethodAnnotations() as $methodName => $annos) {
         foreach ($annos as $anno) {
             if ($anno instanceof \Nucleus\IService\Dashboard\ModelLoader) {
                 $loader = array($className, $methodName);
                 break 2;
             }
         }
     }
     $model->setFields($fields)->setActions($this->extractActionsFromClass($class, $annotations))->setLoader($loader)->setValidator($this->validator);
     return $model;
 }