public function testDimensions()
 {
     $input = array('name' => 'This is my name', 'user' => array('id' => 1, 'name' => 'Thijs'));
     $validator = new Validator();
     $model = new Model('testModel');
     $validator->addModel($model);
     $property = new Property('name');
     $property->addRequirement(new IsType('string'));
     $model->addProperty($property);
     // Submodel
     $userModel = new Model('user');
     $property = new Property('id');
     $property->addRequirement(new IsType('numeric'));
     $userModel->addProperty($property);
     $property = new Property('name');
     $property->addRequirement(new IsType('string'));
     $userModel->addProperty($property);
     $property = new ModelProperty($userModel);
     $property->addRequirement(new Exists());
     $model->addProperty($property);
     $this->assertEquals(true, $validator->validate('testModel', $input));
 }
 /**
  * @param $name
  * @param $property
  * @return Property
  */
 private function getPropertyFromInput($name, $property)
 {
     // Is this property an ArrayProperty?
     if (substr($name, -2) === '[]' || substr($name, -3) === '[]?') {
         return $this->getArrayPropertyFromInput($name, $property);
     } else {
         if (is_array($property)) {
             // If plain array, (not assoc), this is a list of filters(
             if (isset($property[0])) {
                 // Property name is numeric; this is a filter.
                 // Make a property and continue.
                 return Property::make($name, $property);
             } else {
                 // Is this model optional or required?
                 $required = true;
                 if (substr($name, -1) === '?') {
                     $name = substr($name, 0, -1);
                     $required = false;
                 }
                 // Create a model property (with a nice prefix)
                 $prefix = $this->getPrefix() . $name . '.';
                 // Make the model
                 $model = self::make($name, $property, $prefix);
                 // Make the model property
                 $prop = new ModelProperty($model);
                 // Remember when we checked for the "?"
                 if ($required) {
                     $prop->addRequirement(new Exists());
                 }
                 // Return the model property
                 return $prop;
             }
         } else {
             return Property::make($name, $property);
         }
     }
 }