@Override
  public CarriagePackage GeneratePackage(
      CarriageEntity Carriage, Directions CarriageDirection, Directions MotionDirection)
      throws CarriageMotionException {
    CarriagePackage Package;

    if (Anchored) {
      if (MotionDirection == CarriageDirection) {
        throw (new CarriageMotionException(
            "cannot push carriage away from controller in anchored mode"));
      }

      if (MotionDirection == CarriageDirection.Opposite()) {
        throw (new CarriageMotionException(
            "cannot pull carriage into controller in anchored mode"));
      }

      Package = new CarriagePackage(this, Carriage, MotionDirection);

      Carriage.FillPackage(Package);

      if (Package.Body.contains(Package.DriveRecord)) {
        throw (new CarriageMotionException(
            "carriage is attempting to move controller while in anchored mode"));
      }

      if (Package.Body.contains(Package.DriveRecord.NextInDirection(MotionDirection.Opposite()))) {
        throw (new CarriageMotionException(
            "carriage is obstructed by controller while in anchored mode"));
      }
    } else {
      Package = new CarriagePackage(this, Carriage, MotionDirection);

      Package.AddBlock(Package.DriveRecord);

      if (MotionDirection != CarriageDirection) {
        Package.AddPotentialObstruction(Package.DriveRecord.NextInDirection(MotionDirection));
      }

      Carriage.FillPackage(Package);
    }

    Package.Finalize();

    return (Package);
  }