| 
<?php
 /* In the Shopping Cart Definition Page */
 
 require_once('addModule.trait.php');
 
 class shoppingCart{
 use addModules;
 private $products;
 
 public function __construct(){
 $this->defineModuleType('getProductFromDB', 'single');
 $this->defineModuleType('checkVoucherCode', 'multiple');
 
 //initialize shopping cart
 }
 
 public function addVoucherDiscountModule($module){
 $this->addModule('checkVoucherCode', $module);
 }
 
 public function setProductDataModule($module){
 $this->addModule('getProductFromDB', $module);
 }
 
 public function addItem($partNo){
 if(!isset($this->products[$partNo])) {
 $this->products[$partNo] = $this->runModules('getProductFromDB', $partNo)[0];
 }
 //run add item code
 }
 
 //...
 
 public function checkVoucherCode($voucherCode){
 foreach($this->yieldModuleResults($voucherCode) as $results){
 if($results['validCode'] != true) continue;
 else {
 //calculate voucher discount
 }
 }
 }
 }
 
 
 /* In the Shopping Cart Setup Page */
 
 $cart = new shoppingCart();
 
 $cart->setProductDataModule('getProductFromDatabase');
 
 $cart->addVoucherDiscountModule(function($inputCode){
 $voucherCodes = getVoucherCodesFromDB();
 foreach($voucherCodes as $code){
 if($code == strtolower($inputCode)){
 return array(
 'validCode' => true,
 'discount' => getVoucherCodeDiscount($code),
 );
 }
 }
 return array('validCode' => false);
 
 });
 |