 --> execution(tracing.Circle(double, double, double))
 <--  execution(tracing.Circle(double, double, double))
 --> execution(tracing.Circle(double, double, double))
 <--  execution(tracing.Circle(double, double, double))
 --> execution(tracing.Square(double, double, double))
 <--  execution(tracing.Square(double, double, double))
 --> execution(double tracing.Circle.perimeter())
 <--  execution(double tracing.Circle.perimeter())
c1.perimeter() = 12.566370614359172
 --> execution(double tracing.Circle.area())
 <--  execution(double tracing.Circle.area())
c1.area() = 12.566370614359172
 --> execution(double tracing.Square.perimeter())
 <--  execution(double tracing.Square.perimeter())
s1.perimeter() = 4.0
 --> execution(double tracing.Square.area())
 <--  execution(double tracing.Square.area())
s1.area() = 1.0
 --> execution(double tracing.TwoDShape.distance(TwoDShape))
  --> execution(double tracing.TwoDShape.getX())
  <--  execution(double tracing.TwoDShape.getX())
  --> execution(double tracing.TwoDShape.getY())
  <--  execution(double tracing.TwoDShape.getY())
 <--  execution(double tracing.TwoDShape.distance(TwoDShape))
c2.distance(c1) = 4.242640687119285
 --> execution(double tracing.TwoDShape.distance(TwoDShape))
  --> execution(double tracing.TwoDShape.getX())
  <--  execution(double tracing.TwoDShape.getX())
  --> execution(double tracing.TwoDShape.getY())
  <--  execution(double tracing.TwoDShape.getY())
 <--  execution(double tracing.TwoDShape.distance(TwoDShape))
s1.distance(c1) = 2.23606797749979
 --> execution(String tracing.Square.toString())
  --> execution(String tracing.TwoDShape.toString())
  <--  execution(String tracing.TwoDShape.toString())
 <--  execution(String tracing.Square.toString())
s1.toString(): Square side = 1.0 @ (1.0, 2.0) 
