diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/NavViewModel.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt similarity index 92% rename from projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/NavViewModel.kt rename to projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt index 36101c201..6e7aacdaf 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/NavViewModel.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModel.kt @@ -15,18 +15,23 @@ */ @file:Suppress("DeprecatedCallableAddReplaceWith") -package org.koin.compose +package org.koin.compose.viewmodel import androidx.compose.runtime.Composable import androidx.lifecycle.* import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner +import org.koin.compose.currentKoinScope import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersDefinition import org.koin.core.qualifier.Qualifier import org.koin.core.scope.Scope +/* + Ported directly from Android side. Waiting more feedback + */ + /** * Resolve ViewModel instance with Navigation NavBackStackEntry as extras parameters * diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/NavViewModelInternals.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModelInternals.kt similarity index 98% rename from projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/NavViewModelInternals.kt rename to projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModelInternals.kt index ff9368a4d..5d7ecd518 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/NavViewModelInternals.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/NavViewModelInternals.kt @@ -15,7 +15,7 @@ */ @file:Suppress("DeprecatedCallableAddReplaceWith") -package org.koin.compose +package org.koin.compose.viewmodel import androidx.compose.runtime.Composable import androidx.core.bundle.Bundle diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/ViewModel.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt similarity index 92% rename from projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/ViewModel.kt rename to projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt index 988f961ef..03ba8c350 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/ViewModel.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModel.kt @@ -15,18 +15,23 @@ */ @file:Suppress("DeprecatedCallableAddReplaceWith") -package org.koin.compose +package org.koin.compose.viewmodel import androidx.compose.runtime.Composable import androidx.lifecycle.* import androidx.lifecycle.viewmodel.CreationExtras import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner +import org.koin.compose.currentKoinScope import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.annotation.KoinInternalApi import org.koin.core.parameter.ParametersDefinition import org.koin.core.qualifier.Qualifier import org.koin.core.scope.Scope +/* + Ported directly from Android side. Waiting more feedback + */ + /** * Resolve ViewModel instance * diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/ViewModelInternals.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModelInternals.kt similarity index 96% rename from projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/ViewModelInternals.kt rename to projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModelInternals.kt index 43b5fb186..6178f61cd 100644 --- a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/ViewModelInternals.kt +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/ViewModelInternals.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.koin.compose +package org.koin.compose.viewmodel import androidx.compose.runtime.Composable import androidx.lifecycle.HasDefaultViewModelProviderFactory @@ -66,8 +66,7 @@ class KoinViewModelFactory( private val params: ParametersDefinition? = null ) : ViewModelProvider.Factory { - //TODO Handle Extras/Bundle - + //TODO Should handle Extras/Bundle injection here (see Android side) override fun create(modelClass: KClass, extras: CreationExtras): T { return scope.get(kClass, qualifier,params) } diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt new file mode 100644 index 000000000..bacaaaebb --- /dev/null +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ModuleExt.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2017-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.koin.compose.viewmodel.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.definition.Definition +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module +import org.koin.core.qualifier.Qualifier + +//TODO Ported from Android side + +/** + * ViewModel DSL Extension + * Allow to declare a ViewModel - be later inject into Activity/Fragment with dedicated injector + * + * @author Arnaud Giuliani + * + * @param qualifier - definition qualifier + * @param definition - allow definition override + */ +inline fun Module.viewModel( + qualifier: Qualifier? = null, + noinline definition: Definition +): KoinDefinition { + return factory(qualifier, definition) +} diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt new file mode 100644 index 000000000..1d663df70 --- /dev/null +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeSetExt.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2017-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.koin.compose.viewmodel.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.definition.Definition +import org.koin.core.definition.KoinDefinition +import org.koin.core.qualifier.Qualifier +import org.koin.dsl.ScopeDSL + +/** + * ViewModel DSL Extension + * Allow to declare a ViewModel - be later inject into Activity/Fragment with dedicated injector + * + * @author Arnaud Giuliani + * + * @param qualifier - definition qualifier + * @param definition - allow definition override + */ +inline fun ScopeDSL.viewModel( + qualifier: Qualifier? = null, + noinline definition: Definition +): KoinDefinition { + return factory(qualifier, definition) +} \ No newline at end of file diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt new file mode 100644 index 000000000..36b0cd95d --- /dev/null +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ScopeViewModelOf.kt @@ -0,0 +1,224 @@ +/* + * Copyright 2017-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.koin.compose.viewmodel.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.annotation.KoinInternalApi +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.dsl.DefinitionOptions +import org.koin.core.module.dsl.new +import org.koin.core.module.dsl.onOptions +import org.koin.dsl.ScopeDSL + +/** + * Declare a [ScopeDSL.viewModel] definition by resolving a constructor reference for the dependency. + * The resolution is done at compile time by leveraging inline functions, no reflection is required. + * + * Example: + * ``` + * class MyViewModel : ViewModel() + * + * val myModule = module { + * viewModelOf(::MyViewModel) + * } + * ``` + * + * @author Arnaud Giuliani + * + * @see new - function operator + */ + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: () -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) \ No newline at end of file diff --git a/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt new file mode 100644 index 000000000..aa6c49ff5 --- /dev/null +++ b/projects/compose/koin-compose-viewmodel/src/commonMain/kotlin/org/koin/compose/viewmodel/dsl/ViewModelOf.kt @@ -0,0 +1,223 @@ +/* + * Copyright 2017-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.koin.compose.viewmodel.dsl + +import androidx.lifecycle.ViewModel +import org.koin.core.annotation.KoinInternalApi +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module +import org.koin.core.module.dsl.DefinitionOptions +import org.koin.core.module.dsl.new +import org.koin.core.module.dsl.onOptions + +/** + * Declare a [Module.viewModel] definition by resolving a constructor reference for the dependency. + * The resolution is done at compile time by leveraging inline functions, no reflection is required. + * + * Example: + * ``` + * class MyViewModel : ViewModel() + * + * val myModule = module { + * viewModelOf(::MyViewModel) + * } + * ``` + * + * @author Arnaud Giuliani + * + * @see new + */ +inline fun Module.viewModelOf( + crossinline constructor: () -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options) + +/** + * @see viewModelOf + */ +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) -> R, + noinline options: DefinitionOptions? = null, +): KoinDefinition = viewModel { new(constructor) }.onOptions(options)