Skip to content
Snippets Groups Projects
Autoloader.php 2.06 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Autoloader class.
     *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @since 5.25
    
     */
    
    namespace CiviCRM_WP_REST;
    
    class Autoloader {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * @var string
       * Instance.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private static $instance = NULL;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * @var string
       * Namespace.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private $namespace = 'CiviCRM_WP_REST';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * @var array
       * Autoloader directory sources.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private static $source_directories = [];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Constructor.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private function __construct() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $this->register_autoloader();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Creates an instance of this class.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private static function instance() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!self::$instance) {
          self::$instance = new self();
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Adds a directory source.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @param string $source_path The source path
       */
      public static function add_source(string $source_path) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Make sure we have an instance.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        self::instance();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (!is_readable(trailingslashit($source_path))) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return new \WP_Error('civicrm_wp_rest_error', sprintf(__('The source %s is not readable.', 'civicrm'), $source));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        self::$source_directories[] = $source_path;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Registers the autoloader.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
       * @return bool Wehather the autoloader has been registered or not.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private function register_autoloader() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        return spl_autoload_register([$this, 'autoload']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * Loads the classes.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
       * @param string $class_name The class name to load.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      private function autoload($class_name) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $parts = explode('\\', $class_name);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if ($this->namespace !== $parts[0]) {
          return;
        }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Remove namespace and join class path.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $class_path = str_replace('_', '-', implode(DIRECTORY_SEPARATOR, array_slice($parts, 1)));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        array_map(function($source_path) use ($class_path) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $path = $source_path . $class_path . '.php';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!file_exists($path)) {
            return;
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          require $path;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }, static::$source_directories);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      }