public function __construct($level = 1)
 {
     $data = [];
     $data['caller'] = CodeCaller::fromBacktrace(debug_backtrace(), $level);
     $msg = "unreachable code executed at " . $data['caller']['file'] . ':' . $data['caller']['line'];
     parent::__construct(500, $msg, $data);
 }
 public function __construct($value, $reason = null)
 {
     $data = [];
     $data['value'] = $value;
     $data['reason'] = $reason;
     $data['caller'] = CodeCaller::fromBacktrace(debug_backtrace(), 2);
     $msg = "contract failed at " . $data['caller']['file'] . ':' . $data['caller']['line'] . "; failed value is: " . print_r($value, true);
     if ($reason !== null) {
         $msg .= '; contract is: ' . $reason;
     }
     parent::__construct(500, $msg, $data);
 }