building abstractions with procedures