  Effect systems are used to statically reason about the effects an expression
may have when evaluated. In the literature, such effects include various
behaviours as diverse as memory accesses and exception throwing. Here we
present CallE, an object-oriented language that takes a flexible approach where
effects are just method calls: this works well because ordinary methods often
model things like I/O operations, access to global state, or primitive language
operations such as thread creation. CallE supports both flexible and
fine-grained control over such behaviour, in a way designed to minimise the
complexity of annotations.
  CallE's effect system can be used to prevent OO code from performing
privileged operations, such as querying a database, modifying GUI widgets,
exiting the program, or performing network communication. It can also be used
to ensure determinism, by preventing methods from (indirectly) calling
non-deterministic primitives like random number generation or file reading.
