diff --git a/src/Calculation/DefaultCalculator.php b/src/Calculation/DefaultCalculator.php index 5b82850..4d51503 100644 --- a/src/Calculation/DefaultCalculator.php +++ b/src/Calculation/DefaultCalculator.php @@ -3,10 +3,11 @@ namespace Gloudemans\Shoppingcart\Calculation; use Gloudemans\Shoppingcart\CartItem; +use Gloudemans\Shoppingcart\Contracts\Calculator; -class DefaultCalculator +class DefaultCalculator implements Calculator { - public static function getAttribute(string $attribute, CartItem $cartItem) + static function getAttribute(string $attribute, CartItem $cartItem) { $decimals = config('cart.format.decimals', 2); diff --git a/src/Calculation/GrossPrice.php b/src/Calculation/GrossPrice.php index 1442599..03bb3c9 100644 --- a/src/Calculation/GrossPrice.php +++ b/src/Calculation/GrossPrice.php @@ -3,10 +3,11 @@ namespace Gloudemans\Shoppingcart\Calculation; use Gloudemans\Shoppingcart\CartItem; +use Gloudemans\Shoppingcart\Contracts\Calculator; -class GrossPrice +class GrossPrice implements Calculator { - public static function getAttribute(string $attribute, CartItem $cartItem) + static function getAttribute(string $attribute, CartItem $cartItem) { $decimals = config('cart.format.decimals', 2); diff --git a/src/CartItem.php b/src/CartItem.php index 0d089f2..e205401 100644 --- a/src/CartItem.php +++ b/src/CartItem.php @@ -4,9 +4,12 @@ namespace Gloudemans\Shoppingcart; use Gloudemans\Shoppingcart\Calculation\DefaultCalculator; use Gloudemans\Shoppingcart\Contracts\Buyable; +use Gloudemans\Shoppingcart\Contracts\Calculator; +use Gloudemans\Shoppingcart\Exceptions\InvalidCalculatorException; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Support\Jsonable; use Illuminate\Support\Arr; +use ReflectionClass; /** * @property-read mixed discount @@ -398,7 +401,14 @@ class CartItem implements Arrayable, Jsonable return round($this->weight * $this->qty, $decimals); } - return call_user_func(config('cart.calculator', DefaultCalculator::class).'::getAttribute', $attribute, $this); + $class = new ReflectionClass(config('cart.calculator', DefaultCalculator::class)); + if (!$class->implementsInterface(Calculator::class)) + { + throw new InvalidCalculatorException('The configured Calculator seems to be invalid. Calculators have to implement the Calculator Contract.'); + } + + return call_user_func($class->getName().'::getAttribute', $attribute, $this); + } /** diff --git a/src/Contracts/Calculator.php b/src/Contracts/Calculator.php new file mode 100644 index 0000000..170b284 --- /dev/null +++ b/src/Contracts/Calculator.php @@ -0,0 +1,10 @@ +