protected function createSchemas(array $configuration)
    {
        $processor = new Processor();
        $processedConfiguration = $processor->processConfiguration(
            new SchemaConfiguration(),
            $configuration
        );

        $schemas = array();
        foreach ($processedConfiguration as $schemaName => $schemaConfig) {
            $schema = new Schema($schemaName, $schemaConfig['title']);
            foreach ($schemaConfig['groups'] as $groupName => $groupConfig) {
                $group = new Group($groupName, $groupConfig['title']);
                foreach ($groupConfig['characteristics'] as $characteristicName => $characteristicConfig) {
                    $fullName = implode(':', array($schemaName, $groupName, $characteristicName));

                    $this->validateDefinitionConfig($fullName, $characteristicConfig);

                    $definition = new Definition();
                    $definition
                        ->setName($characteristicName)
                        ->setFullName($fullName)
                        ->setType($characteristicConfig['type'])
                        ->setTitle($characteristicConfig['title'])
                        ->setShared($characteristicConfig['shared'])
                        ->setVirtual($characteristicConfig['virtual'])
                        ->setPropertyPaths($characteristicConfig['property_paths'])
                        ->setFormat($characteristicConfig['format'])
                        ->setDisplayGroups($characteristicConfig['display_groups'])
                    ;
                    $group->addDefinition($definition);
                }
                $schema->addGroup($group);
            }
            $schemas[] = $schema;
        }

        return $schemas;
    }