a probably-not-very-good view component class