. * */ namespace Vvveb\System; use Vvveb\System\Cart\Cart; class Shipping { private $driver; private $methods = []; private $instances = []; private $instance; public static function getInstance($options = []) { static $inst = null; if ($inst === null) { $inst = new Shipping($options); } return $inst; } public function __construct($options = []) { } public function getMethods(&$checkoutInfo) { $data = []; foreach ($this->methods as $name => $method) { list($class, $options) = $method; $obj = new $class(Cart::getInstance()); $this->instances[$name] = $obj; $shippingData = $obj->getMethod($checkoutInfo, $options); //if shipping method returns false or no data then don't add it to the list if ($shippingData) { $data[$name] = $shippingData; } } return $data; } public function registerMethod($method, $class, $options = []) { $this->methods[$method] = [$class, $options]; } public function setMethod($method) { foreach ($this->instances as $instance) { $instance->init(); } if (isset($this->instances[$method])) { $this->instance = $this->instances[$method]; $this->instance->setMethod(); } } public function ship(&$checkoutInfo = []) { if ($this->instance) { $this->instance->ship($checkoutInfo); } } }