. */ /** * The calculatable trait, to be used by something of which subtotal, VAT and * total can be calculated */ trait Calculatable { abstract public function calculateSubtotal(); abstract public function calculateVAT(); public function calculateTotal() { return $this->calculateSubtotal() + $this->calculateVAT(); } public function calculate($what = self::TOTAL, $round = 2, $format = true) { $return = 0; switch ($what) { case self::SUBTOTAL: $return = $this->calculateSubtotal(); break; case self::VAT: $return = $this->calculateVAT(); break; case self::TOTAL: $return = $this->calculateTotal(); break; default: return false; } if ($format) { return number_format($return, $round); } else { return $return; } } }