<?php declare( strict_types=1 ); namespace WPDesk\Init\Binding\Loader; use WPDesk\Init\Binding\DefinitionFactory; use WPDesk\Init\Util\Path; use WPDesk\Init\Loader\PhpFileLoader; class FilesystemDefinitions implements BindingDefinitions { /** @var Path */ private $path; /** @var PhpFileLoader */ private $loader; /** @var DefinitionFactory */ private $def_factory; public function __construct( $path, ?PhpFileLoader $loader = null, ?DefinitionFactory $def_factory = null ) { $this->path = new Path( (string) $path ); $this->loader = $loader ?? new PhpFileLoader(); $this->def_factory = $def_factory ?? new DefinitionFactory(); } public function load(): iterable { if ( $this->path->is_directory() ) { foreach ( $this->path->read_directory() as $filename ) { yield from $this->load_from_file( $filename ); } } else { yield from $this->load_from_file( $this->path ); } } private function load_from_file( Path $filename ) { if ( ! $filename->is_file() ) { return; } $hooks = $this->loader->load( (string) $filename ); if ( $filename->get_basename() !== 'index.php' ) { $hooks = [ $filename->get_filename_without_extension() => $hooks ]; } yield from (new ArrayBindingLoader( $hooks ) )->load(); } }