abstraction use cases