# Allium Beta 0.5.0
This update is a complete overhaul from the prior version. Much of the fundamental behaviors remains the same, but the engine behind those behaviors has been changed. Furthermore most all of the APIs have been overhauled in one way or another. For specific documentation please see the [Allium Docs](https://allium.moongarden.dev/).
Major items have been given a title in bold.
## Features
- **Mixin Support**: Lua developers can now write Java mixins in Lua. While it is possible for all mixin injector types to be created, support in the API has been primarily given to the following annotations:
- @Inject
- @ModifyArg
- @ModifyArgs
- @ModifyExpressionValue
- @ModifyReturnValue
- @WrapMethod
- @Definition
- @Expression
- @Cancellable
- @Local
- @Share
- **Class Builder Scope**: The methods provided to a class being built now have access to private methods on themselves, and protected methods on parent classes via the `self` keyword.
- **Java Library Additions**:
- Java primitive types can now be accessed through the `java` library using the primitive name (ex. `java.boolean`)
- Add method `java.callWith()`. Forces a method invocation with the provided parameter type list, instead of inferring them from the parameters.
- Add method `java.coerce()`. Coerces an object that inherits from either `Collection` or `Map` into a table.
- Add method `java.wrap()`. Forcibly wraps a primitive value in one of the Java wrapper classes.
- Add method `java.throw()`. Throws a provided exception.
- Add the `mixin` manifest entrypoint. Used to declare mixins before the game launches.
- Add method `script:registerReloadable()`, expects a `require`-like path to a file that will be executed whenever the script's `reload` method is called.
- The `__len` metamethod is now provided on all objects where a Java `.size()` method or `.length` field is present. This means that any object with either can now have their size inspected with the `#` prefix.
## Changes
- **Class Builder Overhaul**: The class builder API is now a factory pattern, where methods get chained together to build out the class. At the very end a table matching the specified class methods is supplied.
- The `allium` and `java` APIs have been moved from Bouquet to here.
- Java arrays no longer unidirectionally get converted to tables and instead are given a metatable that wraps the array in table-like functionality.
- The game environment that was previously accessed with `package.environment` is now accessed with the `allium.environment()` function.
- The `static` manifest entrypoint has been renamed to `main`
- A wider range of java specific utility types are now supported during coercion.
- Error messages are substantially more detailed.
## Removals
- **Mapping Support Deprecation**: Due to the [removal of obfuscation](https://www.minecraft.net/en-us/article/removing-obfuscation-in-java-edition) and the overwhelming challenge of having to convert between both mappings *and* languages, going forward Allium now exclusively interprets scripts using Mojang's naming scheme. The `"mapping"` key in script's `manifest.json` is no longer supported.
- **Extension Support Deprecation**: Everything that could possibly be done with an extension can be done by creating a dedicated class reserved for Allium scripts. The only major loss here is support for custom globals, but it's bad practice to pollute the global table anyways.
- The `dynamic` entrypoint has been removed in favor of using `script:registerReloadable()`.
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }