view is messy, but has needed getters and setters