<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def apic_driver(self):
 """Get APIC driver There are different drivers for the GBP workflow and Neutron workflow for APIC. First see if the GBP workflow is active, and if so get the APIC driver for it. If the GBP service isn't installed, try to get the driver from the Neutron (APIC ML2) workflow. """

        if not self._apic_driver:
            try:
                self._apic_driver = (bc.get_plugin(
                    'GROUP_POLICY').policy_driver_manager.
                                     policy_drivers['apic'].obj)
                self._get_ext_net_name = self._get_ext_net_name_gbp
                self._get_vrf_context = self._get_vrf_context_gbp
            except AttributeError:
                    LOG.info("GBP service plugin not present -- will "
                             "try APIC ML2 plugin.")
            if not self._apic_driver:
                try:
                    self._apic_driver = (
                        self._core_plugin.mechanism_manager.mech_drivers[
                            'cisco_apic_ml2'].obj)
                    self._get_ext_net_name = self._get_ext_net_name_neutron
                    self._get_vrf_context = self._get_vrf_context_neutron
                except KeyError:
                    LOG.error("APIC ML2 plugin not present: "
                              "no APIC ML2 driver could be found.")
                    raise AciDriverNoAciDriverInstalledOrConfigured()
        return self._apic_driver