public function getPropertyValue($className, $propertyName, $concreteClass = NULL, $options = []) {
        $callConstructor = (isset($options['callConstructor'])) ? (bool) $options['callConstructor'] : FALSE;
        $reflector = new ReflectionClass($className);

        //This is a default property
        if($concreteClass === NULL && $callConstructor === FALSE) {
            $properties = $reflector->getDefaultProperties();

            return (isset($properties[$propertyName])) ? $properties[$propertyName] : NULL;
        }

        //Return NULL if this class not has the given property
        if(!$reflector->hasProperty($propertyName)) {
            return NULL;
        }

        //Get reflector for property and set it accessible
        $propertyReflector = $reflector->getProperty($propertyName);
        $propertyReflector->setAccessible(TRUE);

        //If we give a concrete class returns the value from this class
        if($concreteClass !== NULL) {
            return $propertyReflector->getValue($concreteClass);
        }

        //Needs to call the class constructor
        if($callConstructor === TRUE) {
            $constructorParams = (isset($options['constructorParams'])) ? (array) $options['constructorParams'] : [];

            return $propertyReflector->getValue($reflector->newInstanceArgs($constructorParams));
        }

        //This should never happen
        //@codeCoverageIgnoreStart
        return NULL;
        //@codeCoverageIgnoreEnd
    }