<?php /** * A trait to handle billable models. * * @package WP_Ultimo * @subpackage Models\Traits * @since 2.0.0 */ namespace WP_Ultimo\Models\Traits; use WP_Ultimo\Objects\Billing_Address; /** * Singleton trait. */ trait Billable { /** * The billing address. * * @since 2.0.0 * @var \WP_Ultimo\Objects\Billing_Address */ protected $billing_address; /** * Returns the default billing address. * * Classes that implement this trait need to implement * this method. * * @since 2.0.0 * @return \WP_Ultimo\Objects\Billing_Address */ abstract public function get_default_billing_address(); /** * Gets the billing address for this object. * * @since 2.0.0 * @return \WP_Ultimo\Objects\Billing_Address */ public function get_billing_address() { if (null === $this->billing_address) { $billing_address = $this->get_meta('wu_billing_address'); $this->billing_address = is_a($billing_address, '\WP_Ultimo\Objects\Billing_Address') ? $billing_address : $this->get_default_billing_address(); } return $this->billing_address; } /** * Sets the billing address. * * @since 2.0.0 * * @param array|\WP_Ultimo\Objects\Billing_Address $billing_address The billing address. * @return void */ public function set_billing_address($billing_address): void { if (is_array($billing_address)) { $billing_address = new Billing_Address($billing_address); } $this->meta['wu_billing_address'] = $billing_address; $this->billing_address = $billing_address; } }