protected function createComplexValue(AttributeInterface $attribute, array $options = array())
    {
        $values = array();
        $value_holder = $attribute->createValueHolder();
        $value_type = $value_holder->getValueType();

        if (class_exists($value_type)
            && preg_grep('#ComplexValueInterface$#', class_implements($value_type))
        ) {
            foreach ($value_type::getPropertyMap() as $property_name => $property_type) {
                switch ($property_type) {
                    case ComplexValue::VALUE_TYPE_TEXT:
                        if ($this->shouldGuessByName($options)) {
                            $values[$property_name] = TextGuesser::guess($property_name, $this->faker);
                        }
                        if (empty($values[$property_name])) {
                            $values[$property_name] = $this->faker->words(3, true);
                        }
                        break;
                    case ComplexValue::VALUE_TYPE_URL:
                        $values[$property_name] = $this->faker->url;
                        break;
                    case ComplexValue::VALUE_TYPE_BOOLEAN:
                        $values[$property_name] = $this->faker->boolean();
                        break;
                    case ComplexValue::VALUE_TYPE_INTEGER:
                        $values[$property_name] = $this->faker->numberBetween(0, 10);
                        break;
                    case ComplexValue::VALUE_TYPE_FLOAT:
                        $values[$property_name] = $this->faker->randomFloat(5);
                        break;
                    case ComplexValue::VALUE_TYPE_ARRAY:
                        $numberOfEntries = $this->faker->numberBetween(0, 3);
                        for ($i = 0; $i < $numberOfEntries; $i++) {
                            $values[$property_name][$this->faker->word] = $this->faker->word;
                        }
                        break;
                    default:
                        throw new BadValueException(sprintf(
                            'Unexpected ComplexValue property type "%s" on %s',
                            $property_type,
                            $value_type
                        ));
                }
            }
        }

        return new $value_type($values);
    }