This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new c48f84bdc1 New BeanCreator API
c48f84bdc1 is described below

commit c48f84bdc1c5e31919a5fcb52a61bca19ff8ea36
Author: James Bognar <[email protected]>
AuthorDate: Mon Feb 2 09:54:48 2026 -0500

    New BeanCreator API
---
 .../juneau/commons/inject/BasicBeanStore2.java     |  72 ++----
 .../apache/juneau/commons/inject/BeanCreator2.java |  53 ++---
 .../juneau/commons/inject/CreatableBeanStore.java  | 265 +++++++++++++++++++++
 .../juneau/commons/inject/BeanCreator2_Test.java   |  49 ++--
 4 files changed, 331 insertions(+), 108 deletions(-)

diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
index 88d91f9774..240ba795b3 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
@@ -176,17 +176,8 @@ public class BasicBeanStore2 implements WritableBeanStore {
         * @return The bean, or {@link Optional#empty()} if not found.
         */
        @Override
-       @SuppressWarnings("unchecked")
        public <T> Optional<T> getBean(Class<T> beanType) {
-               var typeMap = entries.get(beanType);
-               if (nn(typeMap)) {
-                       var supplier = typeMap.get("");
-                       if (nn(supplier))
-                               return opt((T)supplier.get());
-               }
-               if (nn(parent))
-                       return parent.getBean(beanType);
-               return opte();
+               return getBean(beanType, null);
        }
 
 
@@ -202,18 +193,8 @@ public class BasicBeanStore2 implements WritableBeanStore {
         * @return The bean, or {@link Optional#empty()} if not found.
         */
        @Override
-       @SuppressWarnings("unchecked")
        public <T> Optional<T> getBean(Class<T> beanType, String name) {
-               var typeMap = entries.get(beanType);
-               if (nn(typeMap)) {
-                       var key = emptyIfNull(name);
-                       var supplier = typeMap.get(key);
-                       if (nn(supplier))
-                               return opt((T)supplier.get());
-               }
-               if (nn(parent))
-                       return parent.getBean(beanType, name);
-               return opte();
+               return resolve(beanType, name).map(Supplier::get);
        }
 
        /**
@@ -253,12 +234,7 @@ public class BasicBeanStore2 implements WritableBeanStore {
         */
        @Override
        public boolean hasBean(Class<?> beanType) {
-               var typeMap = entries.get(beanType);
-               if (nn(typeMap) && typeMap.containsKey(""))
-                       return true;
-               if (n(parent))
-                       return false;
-               return parent.hasBean(beanType);
+               return hasBean(beanType, null);
        }
 
        /**
@@ -273,15 +249,7 @@ public class BasicBeanStore2 implements WritableBeanStore {
         */
        @Override
        public boolean hasBean(Class<?> beanType, String name) {
-               var typeMap = entries.get(beanType);
-               if (nn(typeMap)) {
-                       var key = emptyIfNull(name);
-                       if (typeMap.containsKey(key))
-                               return true;
-               }
-               if (n(parent))
-                       return false;
-               return parent.hasBean(beanType, name);
+               return resolve(beanType, name).isPresent();
        }
 
        /**
@@ -295,21 +263,12 @@ public class BasicBeanStore2 implements WritableBeanStore 
{
         * @return The supplier, or {@link Optional#empty()} if no supplier of 
the specified type exists.
         */
        @Override
-       @SuppressWarnings("unchecked")
        public <T> Optional<Supplier<T>> getBeanSupplier(Class<T> beanType) {
-               var typeMap = entries.get(beanType);
-               if (nn(typeMap)) {
-                       var supplier = typeMap.get("");
-                       if (nn(supplier))
-                               return opt((Supplier<T>)supplier);
-               }
-               if (nn(parent))
-                       return parent.getBeanSupplier(beanType);
-               return opte();
+               return getBeanSupplier(beanType, null);
        }
 
        /**
-        * Returns the supplier for a named bean of the specified type.
+        * Resolves a supplier for a bean of the specified type and name.
         *
         * <p>
         * If no supplier with the specified name is found in this store, 
searches the parent store recursively.
@@ -319,9 +278,8 @@ public class BasicBeanStore2 implements WritableBeanStore {
         * @param name The bean name.  Can be <jk>null</jk>.
         * @return The supplier, or {@link Optional#empty()} if no supplier of 
the specified type and name exists.
         */
-       @Override
        @SuppressWarnings("unchecked")
-       public <T> Optional<Supplier<T>> getBeanSupplier(Class<T> beanType, 
String name) {
+       protected <T> Optional<Supplier<T>> resolve(Class<T> beanType, String 
name) {
                var typeMap = entries.get(beanType);
                if (nn(typeMap)) {
                        var key = emptyIfNull(name);
@@ -334,6 +292,22 @@ public class BasicBeanStore2 implements WritableBeanStore {
                return opte();
        }
 
+       /**
+        * Returns the supplier for a named bean of the specified type.
+        *
+        * <p>
+        * If no supplier with the specified name is found in this store, 
searches the parent store recursively.
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type.
+        * @param name The bean name.  Can be <jk>null</jk>.
+        * @return The supplier, or {@link Optional#empty()} if no supplier of 
the specified type and name exists.
+        */
+       @Override
+       public <T> Optional<Supplier<T>> getBeanSupplier(Class<T> beanType, 
String name) {
+               return resolve(beanType, name);
+       }
+
        @Override /* Overridden from Object */
        public String toString() {
                return r(properties());
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
index ba8cfedabe..c5d06e7b10 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BeanCreator2.java
@@ -205,7 +205,7 @@ public class BeanCreator2<T> {
         * @return A new bean creator.
         */
        public static <T> BeanCreator2<T> of(Class<T> beanType) {
-               return new BeanCreator2<>(beanType, null);
+               return new BeanCreator2<>(beanType, null, null, null);
        }
 
        /**
@@ -217,7 +217,21 @@ public class BeanCreator2<T> {
         * @return A new bean creator.
         */
        public static <T> BeanCreator2<T> of(Class<T> beanType, BeanStore 
parentStore) {
-               return new BeanCreator2<>(beanType, parentStore);
+               return new BeanCreator2<>(beanType, parentStore, null, null);
+       }
+
+       /**
+        * Creates a new bean creator with a parent bean store, name, and 
enclosing instance.
+        *
+        * @param <T> The bean type to create.
+        * @param beanType The bean type to create.
+        * @param parentStore The parent bean store to use for resolving 
dependencies. Can be <jk>null</jk>.
+        * @param name The bean name. Can be <jk>null</jk>.
+        * @param enclosingInstance The enclosing instance object. Can be 
<jk>null</jk>.
+        * @return A new bean creator.
+        */
+       public static <T> BeanCreator2<T> of(Class<T> beanType, BeanStore 
parentStore, String name, Object enclosingInstance) {
+               return new BeanCreator2<>(beanType, parentStore, name, 
enclosingInstance);
        }
 
        private final BeanStore parentStore;
@@ -230,7 +244,7 @@ public class BeanCreator2<T> {
        private ClassInfoTyped<? extends T> beanSubType;
        private ClassInfo explicitBuilderType = null;
        private Object explicitBuilder = null;
-       private Object enclosingInstance;
+       private final Object enclosingInstance;
        private T explicitImplementation = null;
        private List<Consumer<T>> postCreateHooks = new ArrayList<>();
        private Set<String> factoryMethodNames = DEFAULT_FACTORY_METHOD_NAMES;
@@ -238,7 +252,7 @@ public class BeanCreator2<T> {
        private Set<String> buildMethodNames = DEFAULT_BUILD_METHOD_NAMES;
        private Set<String> builderClassNames = DEFAULT_BUILDER_CLASS_NAMES;
        private Supplier<? extends T> fallbackSupplier = null;
-       private String name = null;
+       private final String name;
        private boolean cached = false;
 
        private ResettableSupplier<ClassInfo> builderType = memr(() -> 
findBuilderType());
@@ -252,12 +266,16 @@ public class BeanCreator2<T> {
         *
         * @param beanType The bean type being created.
         * @param parentStore The parent bean store to use for resolving 
dependencies. Can be <jk>null</jk>.
+        * @param name The bean name. Can be <jk>null</jk>.
+        * @param enclosingInstance The enclosing instance object. Can be 
<jk>null</jk>.
         */
-       protected BeanCreator2(Class<T> beanType, BeanStore parentStore) {
+       protected BeanCreator2(Class<T> beanType, BeanStore parentStore, String 
name, Object enclosingInstance) {
                this.beanType = info(assertArgNotNull("beanType", beanType));
                this.beanSubType = this.beanType;
                this.parentStore = parentStore;
                this.store = new BasicBeanStore2(this.parentStore);
+               this.name = name;
+               this.enclosingInstance = enclosingInstance;
        }
 
        /**
@@ -735,19 +753,6 @@ public class BeanCreator2<T> {
                return this;
        }
 
-       /**
-        * Specifies the enclosing instance object to use when instantiating 
inner classes.
-        *
-        * @param outer The enclosing instance object.  Can be <jk>null</jk>.
-        * @return This object.
-        */
-       public BeanCreator2<T> enclosingInstance(Object outer) {
-               try (var writeLock = lock.write()) {
-                       this.enclosingInstance = outer;
-                       reset();
-               }
-               return this;
-       }
 
        /**
         * Specifies custom static factory method names to look for when 
creating the bean.
@@ -1048,18 +1053,6 @@ public class BeanCreator2<T> {
                return this;
        }
 
-       /**
-        * Specifies the name of the bean being created.
-        *
-        * @param value The bean name.  Can be <jk>null</jk>.
-        * @return This object.
-        */
-       public BeanCreator2<T> name(String value) {
-               try (var writeLock = lock.write()) {
-                       this.name = value;
-               }
-               return this;
-       }
 
        /**
         * Resets the builder, builderType, and beanImpl suppliers.
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/CreatableBeanStore.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/CreatableBeanStore.java
new file mode 100644
index 0000000000..2a219d9148
--- /dev/null
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/CreatableBeanStore.java
@@ -0,0 +1,265 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.juneau.commons.inject;
+
+import static org.apache.juneau.commons.utils.AssertionUtils.*;
+import static org.apache.juneau.commons.utils.Utils.*;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.function.*;
+
+/**
+ * A bean store that provides convenient access to {@link BeanCreator2} 
instances for creating beans.
+ *
+ * <p>
+ * This class extends {@link BasicBeanStore2} and adds methods to manage 
{@link BeanCreator2} instances
+ * for different bean types. Creators are lazily created and cached for 
efficient reuse.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ *     <jc>// Create a creatable bean store</jc>
+ *     CreatableBeanStore <jv>store</jv> = <jk>new</jk> 
CreatableBeanStore(<jk>null</jk>);
+ *
+ *     <jc>// Get or create a creator for MyBean</jc>
+ *     BeanCreator2&lt;MyBean&gt; <jv>creator</jv> = 
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>);
+ *
+ *     <jc>// Use the creator to create a bean</jc>
+ *     MyBean <jv>bean</jv> = <jv>creator</jv>.create();
+ *
+ *     <jc>// Explicitly add a creator (optional, getCreator will create if 
missing)</jc>
+ *     <jv>store</jv>.addCreator(MyOtherBean.<jk>class</jk>);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5><ul>
+ *     <li class='jc'>{@link BasicBeanStore2}
+ *     <li class='jc'>{@link BeanCreator2}
+ * </ul>
+ */
+public class CreatableBeanStore extends BasicBeanStore2 {
+
+       private final ConcurrentHashMap<Class<?>, BeanCreator2<?>> creators = 
new ConcurrentHashMap<>();
+       private final Object enclosingInstance;
+
+       /**
+        * Constructor.
+        *
+        * @param parent The parent bean store.  Can be <jk>null</jk>.  Bean 
searches are performed recursively up this parent chain.
+        * @param enclosingInstance The enclosing instance object to use when 
instantiating inner classes. Can be <jk>null</jk>.
+        */
+       public CreatableBeanStore(BeanStore parent, Object enclosingInstance) {
+               super(parent);
+               this.enclosingInstance = enclosingInstance;
+       }
+
+       /**
+        * Same as {@link #addCreator(Class)} but returns the creator instead 
of this object for fluent calls.
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to create a creator for. Cannot be 
<jk>null</jk>.
+        * @return The creator that was created and stored.
+        */
+       public <T> BeanCreator2<T> add(Class<T> beanType) {
+               assertArgNotNull("beanType", beanType);
+               var creator = BeanCreator2.of(beanType, this, null, 
enclosingInstance);
+               creators.put(beanType, creator);
+               return creator;
+       }
+
+       /**
+        * Same as {@link #addCreator(Class, String)} but returns the creator 
instead of this object for fluent calls.
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to create a creator for. Cannot be 
<jk>null</jk>.
+        * @param name The bean name. Can be <jk>null</jk>.
+        * @return The creator that was created and stored.
+        */
+       public <T> BeanCreator2<T> add(Class<T> beanType, String name) {
+               assertArgNotNull("beanType", beanType);
+               var creator = BeanCreator2.of(beanType, this, name, 
enclosingInstance);
+               creators.put(beanType, creator);
+               return creator;
+       }
+
+       /**
+        * Creates and stores a {@link BeanCreator2} for the specified bean 
type.
+        *
+        * <p>
+        * If a creator for this type already exists, it is replaced with a new 
one.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      <jc>// Create and store a creator</jc>
+        *      <jv>store</jv>.addCreator(MyBean.<jk>class</jk>);
+        *
+        *      <jc>// Get the creator</jc>
+        *      BeanCreator2&lt;MyBean&gt; <jv>creator</jv> = 
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>);
+        * </p>
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to create a creator for. Cannot be 
<jk>null</jk>.
+        * @return This object.
+        */
+       public <T> CreatableBeanStore addCreator(Class<T> beanType) {
+               assertArgNotNull("beanType", beanType);
+               var creator = BeanCreator2.of(beanType, this, null, 
enclosingInstance);
+               creators.put(beanType, creator);
+               return this;
+       }
+
+       /**
+        * Creates and stores a {@link BeanCreator2} for the specified bean 
type with a name.
+        *
+        * <p>
+        * If a creator for this type already exists, it is replaced with a new 
one.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      <jc>// Create and store a creator with a name</jc>
+        *      <jv>store</jv>.addCreator(MyBean.<jk>class</jk>, 
<js>"myBean"</js>);
+        *
+        *      <jc>// Get the creator</jc>
+        *      BeanCreator2&lt;MyBean&gt; <jv>creator</jv> = 
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>, <js>"myBean"</js>);
+        * </p>
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to create a creator for. Cannot be 
<jk>null</jk>.
+        * @param name The bean name. Can be <jk>null</jk>.
+        * @return This object.
+        */
+       public <T> CreatableBeanStore addCreator(Class<T> beanType, String 
name) {
+               assertArgNotNull("beanType", beanType);
+               var creator = BeanCreator2.of(beanType, this, name, 
enclosingInstance);
+               creators.put(beanType, creator);
+               return this;
+       }
+
+       /**
+        * Returns the {@link BeanCreator2} for the specified bean type, 
creating it if it doesn't exist.
+        *
+        * <p>
+        * If a creator for this type doesn't exist, a new one is created with 
this bean store configured
+        * and stored for future use.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      <jc>// Get or create a creator</jc>
+        *      BeanCreator2&lt;MyBean&gt; <jv>creator</jv> = 
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>);
+        *
+        *      <jc>// Use the creator to create a bean</jc>
+        *      MyBean <jv>bean</jv> = <jv>creator</jv>.create();
+        * </p>
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to get a creator for. Cannot be 
<jk>null</jk>.
+        * @return The creator for the specified bean type. Never <jk>null</jk>.
+        */
+       @SuppressWarnings("unchecked")
+       public <T> BeanCreator2<T> getCreator(Class<T> beanType) {
+               assertArgNotNull("beanType", beanType);
+               return (BeanCreator2<T>)creators.computeIfAbsent(beanType, k -> 
BeanCreator2.of((Class<T>)k, this, null, enclosingInstance));
+       }
+
+       /**
+        * Returns the {@link BeanCreator2} for the specified bean type with a 
name, creating it if it doesn't exist.
+        *
+        * <p>
+        * If a creator for this type doesn't exist, a new one is created with 
this bean store configured
+        * and stored for future use.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      <jc>// Get or create a creator with a name</jc>
+        *      BeanCreator2&lt;MyBean&gt; <jv>creator</jv> = 
<jv>store</jv>.getCreator(MyBean.<jk>class</jk>, <js>"myBean"</js>);
+        *
+        *      <jc>// Use the creator to create a bean</jc>
+        *      MyBean <jv>bean</jv> = <jv>creator</jv>.create();
+        * </p>
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to get a creator for. Cannot be 
<jk>null</jk>.
+        * @param name The bean name. Can be <jk>null</jk>.
+        * @return The creator for the specified bean type. Never <jk>null</jk>.
+        */
+       @SuppressWarnings("unchecked")
+       public <T> BeanCreator2<T> getCreator(Class<T> beanType, String name) {
+               assertArgNotNull("beanType", beanType);
+               return (BeanCreator2<T>)creators.computeIfAbsent(beanType, k -> 
BeanCreator2.of((Class<T>)k, this, name, enclosingInstance));
+       }
+
+       /**
+        * Resolves a bean supplier by checking creators for matching bean or 
builder types.
+        *
+        * <p>
+        * This method searches through all registered creators to find one 
that can create the requested bean type.
+        * It checks both the creator's bean type and any builder types 
associated with the creator.
+        *
+        * <p>
+        * If no matching creator is found, delegates to the parent store's 
resolve method.
+        *
+        * @param <T> The bean type.
+        * @param beanType The bean type to resolve.
+        * @param name The bean name.  Can be <jk>null</jk>.
+        * @return The supplier, or {@link Optional#empty()} if no matching 
creator or supplier exists.
+        */
+       @Override
+       @SuppressWarnings("unchecked")
+       protected <T> Optional<Supplier<T>> resolve(Class<T> beanType, String 
name) {
+               // First check if there's a creator for the exact bean type
+               var creator = creators.get(beanType);
+               if (nn(creator)) {
+                       return opt(() -> (T)creator.run());
+               }
+
+               // Check all creators for matching bean types (for inheritance)
+               for (var entry : creators.entrySet()) {
+                       var creatorBeanType = entry.getKey();
+                       var c = entry.getValue();
+
+                       // Check if creator's bean type is assignable to the 
requested type
+                       // (i.e., creator creates a subtype that can be cast to 
requested type)
+                       if (nn(creatorBeanType) && 
beanType.isAssignableFrom(creatorBeanType)) {
+                               return opt(() -> (T)c.run());
+                       }
+
+                       // Check builder types - if requested type matches a 
builder type, return the creator
+                       try {
+                               var builderTypes = c.getBuilderTypes();
+                               if (nn(builderTypes)) {
+                                       for (var builderType : builderTypes) {
+                                               if (nn(builderType) && 
builderType.is(beanType)) {
+                                                       return opt(() -> 
(T)c.getBuilder());
+                                               }
+                                       }
+                               }
+                       } catch (Exception e) {
+                               // Skip creators that fail to get builder types
+                               continue;
+                       }
+               }
+
+               // If not found, delegate to parent
+               return super.resolve(beanType, name);
+       }
+
+       @Override
+       public CreatableBeanStore clear() {
+               super.clear();
+               creators.clear();
+               return this;
+       }
+}
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
index b7576bc112..f9db4d4278 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/commons/inject/BeanCreator2_Test.java
@@ -1997,8 +1997,7 @@ class BeanCreator2_Test extends TestBase {
                        var value = "test";
                        beanStore.add(String.class, value);
 
-                       var bean = bc(InnerBean.class)
-                               .enclosingInstance(outerInstance)
+                       var bean = BeanCreator2.of(InnerBean.class, beanStore, 
null, outerInstance)
                                .run();
 
                        assertEquals(value, bean.getValue());
@@ -2345,13 +2344,14 @@ class BeanCreator2_Test extends TestBase {
                }
 
                /**
-                * Tests that enclosingInstance() returns this for method 
chaining.
+                * Tests that enclosingInstance can be set via constructor.
                 */
                @Test
-               void i06_enclosingInstanceReturnsThis() {
-                       var creator = BeanCreator2.of(InnerBean.class);
-                       var result = creator.enclosingInstance(new 
BeanCreator2_Test());
-                       assertSame(creator, result);
+               void i06_enclosingInstanceCanBeSetViaConstructor() {
+                       var outerInstance = new BeanCreator2_Test();
+                       var creator = BeanCreator2.of(InnerBean.class, null, 
null, outerInstance);
+                       // Verify creator was created successfully
+                       assertNotNull(creator);
                }
 
                /**
@@ -3464,22 +3464,22 @@ class BeanCreator2_Test extends TestBase {
                }
 
                /**
-                * Tests that getName() returns the name set via name() method.
+                * Tests that getName() returns the name set via constructor.
                 */
                @Test
                void p04_getNameReturnsSetName() {
-                       var creator = bc(SimpleBean.class).name("myBean");
+                       var creator = BeanCreator2.of(SimpleBean.class, 
beanStore, "myBean", null);
                        var name = creator.getName();
 
                        assertEquals("myBean", name);
                }
 
                /**
-                * Tests that getName() returns null when name is explicitly 
set to null via name(null).
+                * Tests that getName() returns null when name is set to null 
via constructor.
                 */
                @Test
                void p05_getNameReturnsNullWhenSetToNull() {
-                       var creator = 
bc(SimpleBean.class).name("initial").name(null);
+                       var creator = BeanCreator2.of(SimpleBean.class, 
beanStore, null, null);
                        var name = creator.getName();
 
                        assertNull(name, "getName() should return null when 
name is set to null");
@@ -3633,39 +3633,30 @@ class BeanCreator2_Test extends TestBase {
                }
 
                /**
-                * Tests that name() sets the name and returns this for method 
chaining.
+                * Tests that name can be set via constructor.
                 */
                @Test
-               void p17_nameSetsNameAndReturnsThis() {
-                       var creator = BeanCreator2.of(SimpleBean.class);
-                       var result = creator.name("testBean");
+               void p17_nameCanBeSetViaConstructor() {
+                       var creator = BeanCreator2.of(SimpleBean.class, null, 
"testBean", null);
 
-                       // Should return this for method chaining
-                       assertSame(creator, result);
                        assertEquals("testBean", creator.getName());
                }
 
                /**
-                * Tests that name() can accept null value to clear the name.
+                * Tests that name can be set to null via constructor.
                 */
                @Test
                void p18_nameCanBeSetToNull() {
-                       var creator = bc(SimpleBean.class).name("initial");
-                       assertEquals("initial", creator.getName());
-
-                       creator.name(null);
-                       assertNull(creator.getName(), "name() should allow null 
value");
+                       var creator = BeanCreator2.of(SimpleBean.class, 
beanStore, null, null);
+                       assertNull(creator.getName(), "name should allow null 
value");
                }
 
                /**
-                * Tests that name() can be chained multiple times, with later 
calls overriding earlier ones.
+                * Tests that name can be set via constructor.
                 */
                @Test
-               void p19_nameCanBeChained() {
-                       var creator = bc(SimpleBean.class)
-                               .name("first")
-                               .name("second")
-                               .name("final");
+               void p19_nameCanBeSetViaConstructor() {
+                       var creator = BeanCreator2.of(SimpleBean.class, 
beanStore, "final", null);
 
                        assertEquals("final", creator.getName());
                }

Reply via email to