<?php
// your code goes here
trait BoxedValue {
private $boxed_value;
public function __construct($value) { $this->boxed_value = $value; }
public function value() { return $this->boxed_value; }
}
trait MyBool {
abstract public function isTrue() : bool;
public function isFalse() : bool { return !$this->isTrue(); }
}
trait Num {
abstract public function plus($num);
abstract public function negate($num);
public function minus($num) { return $this->plus($num->negate()); }
}
class BoolNum {
use BoxedValue, MyBool, Num;
public function isTrue() : bool {
return $this->value() != 0;
}
public function plus($num) {
return new BoolNum($this->value() + $num->value());
}
public function negate() {
return new BoolNum(- $this->value());
}
}
$a = new BoolNum(-5);
$b = new BoolNum(10);
$c = new BoolNum(0);
PD9waHAKCi8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCnRyYWl0IEJveGVkVmFsdWUgewoJcHJpdmF0ZSAkYm94ZWRfdmFsdWU7CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhbHVlKSB7ICR0aGlzLT5ib3hlZF92YWx1ZSA9ICR2YWx1ZTsgfQoJcHVibGljIGZ1bmN0aW9uIHZhbHVlKCkgeyByZXR1cm4gJHRoaXMtPmJveGVkX3ZhbHVlOyB9Cn0KCnRyYWl0IE15Qm9vbCB7CglhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNUcnVlKCkgOiBib29sOwoJcHVibGljIGZ1bmN0aW9uIGlzRmFsc2UoKSA6IGJvb2wgeyByZXR1cm4gISR0aGlzLT5pc1RydWUoKTsgfQp9Cgp0cmFpdCBOdW0gewoJYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHBsdXMoJG51bSk7CglhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbmVnYXRlKCRudW0pOwoJcHVibGljIGZ1bmN0aW9uIG1pbnVzKCRudW0pIHsgcmV0dXJuICR0aGlzLT5wbHVzKCRudW0tPm5lZ2F0ZSgpKTsgfQp9CgpjbGFzcyBCb29sTnVtIHsKCXVzZSBCb3hlZFZhbHVlLCBNeUJvb2wsIE51bTsKCQoJcHVibGljIGZ1bmN0aW9uIGlzVHJ1ZSgpIDogYm9vbCB7CgkJcmV0dXJuICR0aGlzLT52YWx1ZSgpICE9IDA7CQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gcGx1cygkbnVtKSB7CgkJcmV0dXJuIG5ldyBCb29sTnVtKCR0aGlzLT52YWx1ZSgpICsgJG51bS0+dmFsdWUoKSk7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBuZWdhdGUoKSB7CgkJcmV0dXJuIG5ldyBCb29sTnVtKC0gJHRoaXMtPnZhbHVlKCkpOwoJfQoKfQoKJGEgPSBuZXcgQm9vbE51bSgtNSk7CiRiID0gbmV3IEJvb2xOdW0oMTApOwokYyA9IG5ldyBCb29sTnVtKDApOwoKCnZhcl9kdW1wKCRhLT5pc1RydWUoKSk7CnZhcl9kdW1wKCRiLT5pc0ZhbHNlKCkpOwp2YXJfZHVtcCgkYy0+aXNUcnVlKCkpOwp2YXJfZHVtcCgkYy0+aXNGYWxzZSgpKTsKCgp2YXJfZHVtcCgkYS0+cGx1cygkYikpOwp2YXJfZHVtcCgkYS0+bWludXMoJGIpKTsK