anchor.diff:  
   As the `MorphConfiguration` class is always the aggregate root, the `MorphConfigurationWriter` class should always be used for persisting morph configurations. The writer will dump the entire aggregate into YAML files and store these in a TYPO3 Flow package. The morph configuration name will be used as package name.
   
  +==== Morph configurations
  +
  +The following example shows a persisted morph configuration:
  +
  +[source,yaml]
  +----
  +sourceDirectory: /home/mhelmich/dev/typo3-extbasefluid-examplesite/html
  +extensions:
  +    - { pattern: /^helmich_/ }
  +    - { pattern: /^mittwald_/ }
  +tableStructureMode: MIGRATE
  +pibaseRefactoringMode: PROGRESSIVE
  +----
  +
  +==== Class mapping
  +
  +The following example shows a persisted class mapping configuration:
  +
  +[source,yaml]
  +----
  +reviewed: true
  +classes:
  +  Sjr\SjrOffers\Controller\OrganizationController:
  +    source: typo3conf/ext/sjr_offers/Classes/Controller/OrganizationController.php
  +    newClassname: Sjr\Offers\Controller\OrganizationController
  +    package: Sjr.Offers
  +    action: MORPH
  +    target: Classes/Sjr/Offers/Controller/OrganizationController.php
  +  Sjr\SjrOffers\Controller\OfferController:
  +    source: typo3conf/ext/sjr_offers/Classes/Controller/OfferController.php
  +    newClassname: Sjr\Offers\Controller\OfferController
  +    package: Sjr.Offers
  +    action: MORPH
  +    target: Classes/Sjr/Offers/Controller/OfferController.php
  +  Sjr\SjrOffers\Domain\Model\Region:
  +    source: typo3conf/ext/sjr_offers/Classes/Domain/Model/Region.php
  +    newClassname: Sjr\Offers\Domain\Model\Region
  +    package: Sjr.Offers
  +    action: MORPH
  +    target: Classes/Sjr/Offers/Domain/Model/Region.php
  +  Sjr\SjrOffers\Service\AccessControlService:
  +    source: typo3conf/ext/sjr_offers/Classes/Service/AccessControlService.php
  +    newClassname: Sjr\Offers\Service\AccessControlService
  +    package: Sjr.Offers
  +    action: MORPH
  +    target: Classes/Sjr/Offers/Service/AccessControlService.php
  +
  +# ...
  +----
  +
   === Constraints
   
   There are some constraints that the current state of the domain model entities must always fulfil. Since the transformation steps may change the domain entities, these constraints are checked before and after each transformation step. This is done using aspects of Flow's AOP framework.
  
positive.code: use Mw\Metamorph\Domain\Service\MorphExecutionState;
  use Symfony\Component\Console\Output\OutputInterface;
  
  interface Transformation
  {
      public function setSettings(array $settings);
      public function execute(
          MorphConfiguration $configuration,
  
negative.code:     transformations:
        extensionInventory:
          name: ExtensionInventory # <1>
        classInventory:
          name: ClassInventory
          dependsOn: [extensionInventory] # <2>
          settings: # <3>
            visitors: []
        resourceInventory:
          name: ResourceInventory
          dependsOn: [extensionInventory]
        createPackages:
          name: CreatePackages:
          dependsOn: [extensionInventory, classInventory, resourceInventory]
  ----
  <1> This is a class name. If you specify an unqualified class name, Metamorph will assume the namespace `Mw\Metamorph\Transformation` for this class.
  <2> You can specify dependencies for each transformation step. Metamorph will determine the final execution order of all transformation steps using _topological sorting_.
  <3> Some transformations allow you to pass custom settings. These will be passed into the `setSettings` method of the transformation class.
  
  As you may have guessed, you are free to add additional transformation steps to this list in the settings of your own packages. This allows you to extend and modify Metamorph's default transformation process according to your own custom requirements.
  