This is a transpiler that will allow native usage of php8 features and especially syntax in projects and libraries, while allowing maintainers to publish a version targeting 7.0 or even lower versions of php.
The transpiler will seamlessly hook into composer to transpile the package (and all dependencies down the current branch of the dependency tree!) on installation, on the user's machine, targeting the user's specific php version (or another one specified in the config).
All dependencies of a package with a phabel configuration are processed with phabel with the same configuration, to allow transpiling towards an arbitrary version of PHP; composer takes care of choosing the best package, according to the current version of PHP.
All plugins specified in the configuration of each package are added to the [phabel plugin graph](https://github.com/phabelio/phabel/blob/master/src/PluginGraph/GraphInternal.php).
The [plugin graph](https://github.com/phabelio/phabel/blob/master/src/PluginGraph/GraphInternal.php) takes care of properly trickling configuration values and plugins down the dependency graph, as well as plugin graph optimization by merging multiple transforms (if allowed) in a single AST traversal.
Each [phabel plugin](https://github.com/phabelio/phabel/blob/master/src/PluginInterface.php) can specify multiple `leave*` and `enter*` methods, called when traversing down or up the dependency graph.
A second, optional parameter can be provided, to allow the [Traverser](https://github.com/phabelio/phabel/blob/master/src/Traverser.php) to pass a [Context](https://github.com/phabelio/phabel/blob/master/src/Context.php) object with helper methods for replacing nodes in arbitrary positions of the AST stack.
Plugins can also specify other plugins as "dependencies" or "reverse dependencies", with the `runBefore`, `runAfter`, `runWithBefore`, `runWithAfter` methods, to force some transforms to run before others.
Each [phabel plugin](https://github.com/phabelio/phabel/blob/master/src/PluginInterface.php) can also accept a configuration: this a simple way to reuse code, by specifying a single plugin for a class of transforms, and then requiring it from other plugins, specifying a specific configuration to trigger only certain transforms.
When possible, the plugin graph will try to merge a plugin with multiple configs into a single (or fewer) plugins using the [`mergeConfigs` method](https://github.com/phabelio/phabel/blob/master/src/PluginInterface.php) of the plugin.
[Multiple transforms are available](https://github.com/phabelio/phabel/tree/master/src/Target), covering all PHP 7 features.
More complex and generic transforms like typehint and nested expression polyfilling can be found in the [plugin folder](https://github.com/phabelio/phabel/tree/master/src/Plugin).