# Overload functions (overfn)
This crate allows you to overload functions with the same name but with different number of arguments through the
[`overload`](https://docs.rs/overfn/latest/overfn/macro.overload.html) macro. After overloading all the functions, you
need to use the [`macros!()`](https://docs.rs/overfn/latest/overfn/macro.macros.html) to genarate the macros to invoke
the overloaded functions.
## Example
```rust
use overfn::*;
#[overload]
fn test(item: usize) -> usize {
item
}
#[overload]
fn test(left: usize, right: usize) -> usize {
left + right
}
struct Test(usize);
impl Test {
#[overload(Test)]
fn new() -> Self {
Self(0)
}
#[overload(Test)]
fn new(item: usize) -> Self {
Self(item)
}
#[overload(Test)]
fn test(&self) -> usize {
self.0
}
#[overload(Test)]
fn test(&self, other: usize) -> usize {
self.0 + other
}
}
macros!();
assert_eq!(test!(2), 2);
assert_eq!(test!(2, 2), 4);
let test = Test_new!();
assert_eq!(test.0, 0);
let test = Test_new!(2);
assert_eq!(test.0, 2);
assert_eq!(Test_test!(test), 2);
assert_eq!(Test_test!(test, 2), 4);
```
## Documentation
You can find the documentation [here](https://docs.rs/overfn).
## Limitations
- Curretly, you can't overload a function with the same number of arguments with different types.
- You need to use the [`macros!()`](https://docs.rs/overfn/latest/overfn/macro.macros.html) macro to generate the macros
to call the overloaded functions.
- If you overload a class method or instance method, you need to pass the class name in the attribute.
## License
This project is licensed under the [MIT license](LICENSE-MIT) or [Apache License, Version 2.0](LICENSE-APACHE) at your option.