@startuml

class GUI{
    This is a singleton
    ---
    - ImageContainer _currentImage
    - ImageManipulation[] _imageManipulations
    + none initialise()
}


class ImageContainer{
    - imagedata _imageData
    + none loadImage(path: str)
    + imagedata getImage()
    + pair<int,int> getDimensions()
}

abstract class ImageManipulation{
    +none manipulateImage(ImageContainer, Parameters)
    +str[] getParameters()
    +str getManipulationName()
}

abstract class Filters{
list[ImageManipulation] getFilters()
}

class LiveFilters{
}

class PostFilters{
}

class CropImage{
- str _name
}

class GreyScaleImage{
- str _name
}

class SmoothImage{
- str _name
}

class RotateImage{
- str _name
}

class HSVImage{
- str _name
}

class HueShiftImage{
- str _name
}

class GeoFilter{
- str _name
}

class GeoLocation{
str getUserCurrentTown()
}

class FaceRecognition{
pair[int,int] getFaceCentre(ImageContainer)
}

GUI ..> ImageContainer
GUI ..> LiveFilters
GUI ..> PostFilters
LiveFilters ..|> Filters
PostFilters ..|> Filters
Filters ..> ImageManipulation

FaceRecognition ..> ImageContainer

GeoFilter ..> GeoLocation

CropImage  ..|> ImageManipulation
GreyScaleImage ..|> ImageManipulation
SmoothImage ..|> ImageManipulation
RotateImage ..|> ImageManipulation
HSVImage ..|> ImageManipulation
HueShiftImage ..|> ImageManipulation
GeoFilter ..|> ImageManipulation


@enduml