Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java?rev=1724881&r1=1724880&r2=1724881&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ComponentBuilderImpl.java
 Fri Jan 15 21:43:31 2016
@@ -19,15 +19,19 @@ import org.apache.felix.dm.Component;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.builder.lambda.BundleDependencyBuilder;
+import org.apache.felix.dm.builder.lambda.Cb;
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ConfigurationDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.DependencyBuilder;
+import org.apache.felix.dm.builder.lambda.Functions.CbBiConsumer;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
+import org.apache.felix.dm.builder.lambda.Functions.CbConsumer;
 import org.apache.felix.dm.builder.lambda.Functions.FluentProperties;
+import 
org.apache.felix.dm.builder.lambda.impl.ServiceCallbacksBuilderImpl.MethodRef;
 import org.apache.felix.dm.builder.lambda.FutureDependencyBuilder;
 import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
 
-public class ComponentBuilderImpl<T> implements ComponentBuilder<T> {
+public class ComponentBuilderImpl implements 
ComponentBuilder<ComponentBuilderImpl> {
     private final List<DependencyBuilder<?>> m_dependencyBuilders = new 
ArrayList<>();
     private final Component m_component;
     private final boolean m_componentUpdated;
@@ -37,10 +41,15 @@ public class ComponentBuilderImpl<T> imp
     private Object m_factory;
     private boolean m_factoryHasComposite;     
     private boolean m_autoAdd = true;
-       private final Map<String, Consumer<Component>> m_lfclCallbacks = new 
HashMap<>();
+    protected final Map<Cb, List<MethodRef<Object>>> m_refs = new HashMap<>();
     private Object m_compositionInstance;
     private String m_compositionMethod;        
 
+    @FunctionalInterface
+    interface MethodRef<I> {
+        public void accept(I instance, Component c);
+    }
+
     public ComponentBuilderImpl(DependencyManager dm) {
         m_component = dm.createComponent();
         m_componentUpdated = false;
@@ -52,120 +61,120 @@ public class ComponentBuilderImpl<T> imp
     }
         
     @Override
-    public <U> ComponentBuilderImpl<T> autoInject(Class<U> clazz, boolean 
autoConfig) {
+    public <U> ComponentBuilderImpl autoInject(Class<U> clazz, boolean 
autoConfig) {
         m_component.setAutoConfig(clazz, autoConfig);
         return this;
     }
 
     @Override
-    public <U> ComponentBuilderImpl<T> autoInject(Class<U> clazz, String 
instanceName) {
+    public <U> ComponentBuilderImpl autoInject(Class<U> clazz, String 
instanceName) {
         m_component.setAutoConfig(clazz, instanceName);
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?> iface) {
+    public ComponentBuilderImpl provides(Class<?> iface) {
         m_serviceNames = new String[] {iface.getName()};
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?>  iface, String name, 
Object value, Object ... rest) {
+    public ComponentBuilderImpl provides(Class<?>  iface, String name, Object 
value, Object ... rest) {
         provides(iface);
         properties(name, value, rest);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?>  iface, FluentProperties 
... properties) {
+    public ComponentBuilderImpl provides(Class<?>  iface, FluentProperties ... 
properties) {
         provides(iface);
         properties(properties);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?>  iface, Dictionary<?,?> 
properties) {
+    public ComponentBuilderImpl provides(Class<?>  iface, Dictionary<?,?> 
properties) {
         provides(iface);
         properties(properties);
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T>  provides(Class<?>[] ifaces) {
+    public ComponentBuilderImpl  provides(Class<?>[] ifaces) {
         m_serviceNames = Stream.of(ifaces).map(c -> 
c.getName()).toArray(String[]::new);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?>[] ifaces, String name, 
Object value, Object ... rest) {
+    public ComponentBuilderImpl provides(Class<?>[] ifaces, String name, 
Object value, Object ... rest) {
         provides(ifaces);
         properties(name, value, rest);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?>[] ifaces, 
FluentProperties ... properties) {
+    public ComponentBuilderImpl provides(Class<?>[] ifaces, FluentProperties 
... properties) {
         provides(ifaces);
         properties(properties);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(Class<?>[] ifaces, Dictionary<?,?> 
properties) {
+    public ComponentBuilderImpl provides(Class<?>[] ifaces, Dictionary<?,?> 
properties) {
         provides(ifaces);
         properties(properties);
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T> provides(String iface) {
+    public ComponentBuilderImpl provides(String iface) {
         m_serviceNames = new String[] {iface};
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T> provides(String iface, String name, Object 
value, Object ... rest) {
+    public ComponentBuilderImpl provides(String iface, String name, Object 
value, Object ... rest) {
         provides(iface);
         properties(name, value, rest);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(String iface, FluentProperties ... 
properties) {
+    public ComponentBuilderImpl provides(String iface, FluentProperties ... 
properties) {
         provides(iface);
         properties(properties);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(String  iface, Dictionary<?,?> 
properties) {
+    public ComponentBuilderImpl provides(String  iface, Dictionary<?,?> 
properties) {
         provides(iface);
         properties(properties);
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T>  provides(String[] ifaces) {
+    public ComponentBuilderImpl  provides(String[] ifaces) {
         m_serviceNames = ifaces;
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(String[] ifaces, String name, 
Object value, Object ... rest) {
+    public ComponentBuilderImpl provides(String[] ifaces, String name, Object 
value, Object ... rest) {
         provides(ifaces);
         properties(name, value, rest);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(String[] ifaces, FluentProperties 
... properties) {
+    public ComponentBuilderImpl provides(String[] ifaces, FluentProperties ... 
properties) {
         provides(ifaces);
         properties(properties);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> provides(String[] ifaces, Dictionary<?,?> 
properties) {
+    public ComponentBuilderImpl provides(String[] ifaces, Dictionary<?,?> 
properties) {
         provides(ifaces);
         properties(properties);
         return this;
@@ -173,13 +182,13 @@ public class ComponentBuilderImpl<T> imp
     
     @SuppressWarnings("unchecked")
     @Override
-    public ComponentBuilderImpl<T> properties(Dictionary<?, ?> properties) {
+    public ComponentBuilderImpl properties(Dictionary<?, ?> properties) {
         m_properties = (Dictionary<Object, Object>) properties;
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl<T> properties(String name, Object value, 
Object ... rest) {
+    public ComponentBuilderImpl properties(String name, Object value, Object 
... rest) {
        Objects.nonNull(name);
        Objects.nonNull(value);
         Properties props = new Properties();
@@ -197,7 +206,7 @@ public class ComponentBuilderImpl<T> imp
     }
     
     @Override
-    public ComponentBuilderImpl<T> properties(FluentProperties ... properties) 
{
+    public ComponentBuilderImpl properties(FluentProperties ... properties) {
        Dictionary<Object, Object> props = new Hashtable<>();
        Stream.of(properties).forEach(property -> {
                String name = Helpers.getLambdaParameterName(property, 0);
@@ -212,18 +221,18 @@ public class ComponentBuilderImpl<T> imp
     }
 
     @Override
-    public ComponentBuilderImpl<T> debug(String label) {
+    public ComponentBuilderImpl debug(String label) {
         m_component.setDebug(label);
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl<T> autoAdd(boolean autoAdd) {
+    public ComponentBuilderImpl autoAdd(boolean autoAdd) {
         m_autoAdd = autoAdd;
         return this;
     }
     
-    public ComponentBuilderImpl<T> autoAdd() {
+    public ComponentBuilderImpl autoAdd() {
         m_autoAdd = true;
        return this;
     }
@@ -232,23 +241,20 @@ public class ComponentBuilderImpl<T> imp
         return m_autoAdd;
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilder<U> impl(U instance) {
+    public <U> ComponentBuilderImpl impl(U instance) {
         m_impl = instance;
-        return (ComponentBuilder<U>) this;
+        return this;
     }
     
-    @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilder<U> impl(Class<U> implClass) {
+    public <U> ComponentBuilderImpl impl(Class<U> implClass) {
         m_impl = implClass;
-        return (ComponentBuilder<U>) this;
+        return this;
     }
     
-    @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilder<U> factory(Supplier<U> create) {
+    public <U> ComponentBuilderImpl factory(Supplier<U> create) {
         Objects.nonNull(create);
         m_factory = new Object() {
             @SuppressWarnings("unused")
@@ -256,12 +262,11 @@ public class ComponentBuilderImpl<T> imp
                 return create.get();
             }
         };
-        return (ComponentBuilder<U>) this;
+        return this;
     }
     
-    @SuppressWarnings("unchecked")
     @Override
-    public <U, V> ComponentBuilder<V> factory(Supplier<U> supplier, 
Function<U, V> create) {
+    public <U, V> ComponentBuilderImpl factory(Supplier<U> supplier, 
Function<U, V> create) {
         Objects.nonNull(supplier);
         Objects.nonNull(create);
         
@@ -272,12 +277,11 @@ public class ComponentBuilderImpl<T> imp
                 return create.apply(factoryImpl);
             }
         }; 
-        return (ComponentBuilder<V>) this;
+        return this;
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilder<U> factory(Supplier<U> create, 
Supplier<Object[]> getComposite) {
+    public <U> ComponentBuilderImpl factory(Supplier<U> create, 
Supplier<Object[]> getComposite) {
         Objects.nonNull(create);
         Objects.nonNull(getComposite);
         
@@ -293,11 +297,11 @@ public class ComponentBuilderImpl<T> imp
             }
         };
         m_factoryHasComposite = true;
-        return (ComponentBuilder<U>) this;
+        return this;
     }
     
     @Override
-    public <U, V> ComponentBuilder<V> factory(Supplier<U> factorySupplier, 
Function<U, V> factoryCreate, Function<U, Object[]> factoryGetComposite) {
+    public <U, V> ComponentBuilderImpl factory(Supplier<U> factorySupplier, 
Function<U, V> factoryCreate, Function<U, Object[]> factoryGetComposite) {
         Objects.nonNull(factorySupplier);
         Objects.nonNull(factoryCreate);
         Objects.nonNull(factoryGetComposite);
@@ -317,20 +321,20 @@ public class ComponentBuilderImpl<T> imp
             }
         }; 
         m_factoryHasComposite = true;
-        return (ComponentBuilder<V>) this;
+        return this;
     }
         
-    public ComponentBuilderImpl<T> composition(String getCompositionMethod) {
+    public ComponentBuilderImpl composition(String getCompositionMethod) {
         return composition(null, getCompositionMethod);
     }
     
-    public ComponentBuilderImpl<T> composition(Object instance, String 
getCompositionMethod) {
+    public ComponentBuilderImpl composition(Object instance, String 
getCompositionMethod) {
         m_compositionInstance = instance;
         m_compositionMethod = getCompositionMethod;
         return this;
     }
     
-    public ComponentBuilderImpl<T> composition(Supplier<Object[]> 
getCompositionMethod) {
+    public ComponentBuilderImpl composition(Supplier<Object[]> 
getCompositionMethod) {
         m_compositionInstance = new Object() {
             public Object[] getComposition() {
                 return getCompositionMethod.get();
@@ -341,7 +345,7 @@ public class ComponentBuilderImpl<T> imp
     }
 
     @Override
-    public ComponentBuilderImpl<T> withService(Class<?> service, Class<?> ... 
services) {
+    public ComponentBuilderImpl withService(Class<?> service, Class<?> ... 
services) {
         doWithService(service);
         for (Class<?> s : services) {
             doWithService(s);
@@ -355,7 +359,7 @@ public class ComponentBuilderImpl<T> imp
     }
 
     @Override
-    public <U> ComponentBuilderImpl<T> withService(Class<U> service, 
Consumer<ServiceDependencyBuilder<U>> consumer) {
+    public <U> ComponentBuilderImpl withService(Class<U> service, 
Consumer<ServiceDependencyBuilder<U>> consumer) {
         ServiceDependencyBuilder<U> dep = new 
ServiceDependencyBuilderImpl<>(m_component, service);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
@@ -363,7 +367,7 @@ public class ComponentBuilderImpl<T> imp
     }   
     
     @Override
-    public ComponentBuilderImpl<T> 
withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer) {
+    public ComponentBuilderImpl 
withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer) {
         ConfigurationDependencyBuilder dep = new 
ConfigurationDependencyBuilderImpl(m_component);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
@@ -371,7 +375,7 @@ public class ComponentBuilderImpl<T> imp
     }
     
     @Override
-    public ComponentBuilderImpl<T> 
withBundle(Consumer<BundleDependencyBuilder> consumer) {
+    public ComponentBuilderImpl withBundle(Consumer<BundleDependencyBuilder> 
consumer) {
        BundleDependencyBuilder dep = new 
BundleDependencyBuilderImpl(m_component);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
@@ -379,7 +383,7 @@ public class ComponentBuilderImpl<T> imp
     }
            
     @Override
-    public <V> ComponentBuilder<T> withFuture(CompletableFuture<V> future, 
Consumer<FutureDependencyBuilder<V>> consumer) {
+    public <V> ComponentBuilderImpl withFuture(CompletableFuture<V> future, 
Consumer<FutureDependencyBuilder<V>> consumer) {
         FutureDependencyBuilder<V> dep = new 
CompletableFutureDependencyImpl<>(m_component, future);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
@@ -387,126 +391,25 @@ public class ComponentBuilderImpl<T> imp
     }
 
     @Override
-    public final ComponentBuilderImpl<T> init(Consumer<T> callback) {
-       return setLifecycleComponentCallback("init", callback);
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> init(BiConsumer<T, Component> 
callback) {
-       return setLifecycleComponentCallback("init", callback);        
-    }
-
-    @Override
-    public <U> ComponentBuilderImpl<T> init(Class<U> type, Consumer<U> 
callback) {
-        return setLifecycleCompositeCallback("init", type, callback);
-    }
-   
-    @Override
-    public <U> ComponentBuilderImpl<T> init(Class<U> type, BiConsumer<U, 
Component> callback) {
-        return setLifecycleCompositeCallback("init", type, callback);
-    }
-
-    @Override
-    public ComponentBuilderImpl<T> init(Runnable callback) {
-        return setLifecycleCallback("init", callback);
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> init(CbComponent callback) {
-        m_lfclCallbacks.put("init", component -> callback.accept(component));
-        return this;
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> start(Consumer<T> callback) {
-       return setLifecycleComponentCallback("start", callback);
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> start(BiConsumer<T, Component> 
callback) {
-       return setLifecycleComponentCallback("start", callback);        
-    }
-
-    @Override
-    public <U> ComponentBuilderImpl<T> start(Class<U> type, Consumer<U> 
callback) {
-        return setLifecycleCompositeCallback("start", type, callback);
-    }
-   
-    @Override
-    public <U> ComponentBuilderImpl<T> start(Class<U> type, BiConsumer<U, 
Component> callback) {
-        return setLifecycleCompositeCallback("start", type, callback);
-    }
-
-    @Override
-    public ComponentBuilderImpl<T> start(Runnable callback) {
-        return setLifecycleCallback("start", callback);
-    }
-    
-    @Override
-    public final ComponentBuilderImpl<T> start(CbComponent callback) {
-        m_lfclCallbacks.put("start", component -> callback.accept(component));
-        return this;
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> stop(Consumer<T> callback) {
-       return setLifecycleComponentCallback("stop", callback);
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> stop(BiConsumer<T, Component> 
callback) {
-       return setLifecycleComponentCallback("stop", callback);        
-    }
-
-    @Override
-    public <U> ComponentBuilderImpl<T> stop(Class<U> type, Consumer<U> 
callback) {
-        return setLifecycleCompositeCallback("stop", type, callback);
-    }
-   
-    @Override
-    public <U> ComponentBuilderImpl<T> stop(Class<U> type, BiConsumer<U, 
Component> callback) {
-        return setLifecycleCompositeCallback("stop", type, callback);
+    public <U> ComponentBuilderImpl cb(Cb callbackType, CbConsumer<U> 
callback) {
+        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+       return setComponentCallbackRef(callbackType, type, (inst, component) -> 
callback.accept((U) inst));
     }
 
     @Override
-    public ComponentBuilderImpl stop(Runnable callback) {
-        return setLifecycleCallback("stop", callback);
+    public <U> ComponentBuilderImpl cb(Cb callbackType, CbBiConsumer<U, 
Component> callback) {
+        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        return setComponentCallbackRef(callbackType, type, (inst, component) 
-> callback.accept((U) inst, component));
     }
 
     @Override
-    public final ComponentBuilderImpl<T> stop(CbComponent callback) {
-        m_lfclCallbacks.put("stop", component -> callback.accept(component));
-        return this;
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> destroy(Consumer<T> callback) {
-       return setLifecycleComponentCallback("destroy", callback);
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> destroy(BiConsumer<T, Component> 
callback) {
-       return setLifecycleComponentCallback("destroy", callback);        
-    }
-
-    public <U> ComponentBuilderImpl<T> destroy(Class<U> type, Consumer<U> 
callback) {
-        return setLifecycleCompositeCallback("destroy", type, callback);
-    }
-   
-    @Override
-    public <U> ComponentBuilderImpl<T> destroy(Class<U> type, BiConsumer<U, 
Component> callback) {
-        return setLifecycleCompositeCallback("destroy", type, callback);
+    public ComponentBuilderImpl cbi(Cb callbackType, Runnable callback) {
+        return setInstanceCallbackRef(callbackType, (inst, component) -> 
callback.run());
     }
 
     @Override
-    public ComponentBuilderImpl<T> destroy(Runnable callback) {
-        return setLifecycleCallback("destroy", callback);
-    }
-
-    @Override
-    public final ComponentBuilderImpl<T> destroy(CbComponent callback) {
-        m_lfclCallbacks.put("destroy", component -> 
callback.accept(component));
-        return this;
+    public ComponentBuilderImpl cbi(Cb callbackType, CbComponent callback) {
+        return setInstanceCallbackRef(callbackType, (inst, component) -> 
callback.accept(component));
     }
 
     public Component build() {
@@ -530,7 +433,7 @@ public class ComponentBuilderImpl<T> imp
                }
            }
             
-           if (m_lfclCallbacks.size() > 0) {
+           if (m_refs.size() > 0) {
                   setLifecycleMethodRefs();
            }            
         }
@@ -544,78 +447,55 @@ public class ComponentBuilderImpl<T> imp
         return m_component;
     }
 
-    @SuppressWarnings("unchecked")
-    private ComponentBuilderImpl<T> setLifecycleComponentCallback(String 
method, Consumer<T> callback) {
-        m_lfclCallbacks.put(method, component -> { 
-            callback.accept((T) component.getInstance());
+    protected <U> ComponentBuilderImpl setInstanceCallbackRef(Cb cbType, 
MethodRef<U> ref) {
+        cbType.ensureLifecyleCallback();
+        List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
+        list.add((instance, component) -> {
+            ref.accept(null, component);
         });
         return this;
     }
 
-    @SuppressWarnings("unchecked")
-    private ComponentBuilderImpl<T> setLifecycleComponentCallback(String 
method, BiConsumer<T, Component> callback) {
-        m_lfclCallbacks.put(method, component -> { 
-            callback.accept((T) component.getInstance(), component);
-        });
-        return this;
-    }
-
-    private <U> ComponentBuilderImpl<T> setLifecycleCompositeCallback(String 
method, Class<U> type, Consumer<U> callback) {
-        m_lfclCallbacks.put("init", component -> {
-            for (Object instance : component.getInstances()) {
-                if (Helpers.getClass(instance).equals(type)) {
-                    callback.accept((U) instance);
-                    break;
-                }
-            }
-        });
-        return this;
-    }
-    
-    private <U> ComponentBuilderImpl<T> setLifecycleCompositeCallback(String 
method, Class<U> type, BiConsumer<U, Component> callback) {
-        m_lfclCallbacks.put("init", component -> {
-            for (Object instance : component.getInstances()) {
-                if (Helpers.getClass(instance).equals(type)) {
-                    callback.accept((U) instance, component);
-                    break;
+    private <U> ComponentBuilderImpl setComponentCallbackRef(Cb cbType, 
Class<U> type, MethodRef<U> callback) {
+        cbType.ensureLifecyleCallback();
+        List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
+        list.add((instance, component) -> {
+            Stream.of(component.getInstances()).forEach(inst -> {
+                if (Helpers.getClass(inst).equals(type)) {
+                    callback.accept((U) inst, component);
                 }
-            }
+            });
         });
         return this;
     }
-
-    private ComponentBuilderImpl<T> setLifecycleCallback(String method, 
Runnable callback) {
-        m_lfclCallbacks.put(method, component -> callback.run());
-        return this;
-    }
-    
+        
     @SuppressWarnings("unused")
     private void setLifecycleMethodRefs() {
         Object cb = new Object() {
             void init(Component comp) {
-               invokeLfcleCallbacks("init", comp);
+               invokeLfcleCallbacks(Cb.INIT, comp);
             }
 
             void start(Component comp) {
-               invokeLfcleCallbacks("start", comp);
+               invokeLfcleCallbacks(Cb.START, comp);
             }
 
             void stop(Component comp) {
-               invokeLfcleCallbacks("stop", comp);
+               invokeLfcleCallbacks(Cb.STOP, comp);
             }
 
             void destroy(Component comp) {
-               invokeLfcleCallbacks("destroy", comp);
+               invokeLfcleCallbacks(Cb.DESTROY, comp);
             }
         };
         m_component.setCallbacks(cb, "init", "start", "stop", "destroy");
     }
     
-    private void invokeLfcleCallbacks(String method, Component component) {
-       m_lfclCallbacks.computeIfPresent(method, (m, componentConsumer) -> {
-               componentConsumer.accept(component);
-                       return componentConsumer;
-               });
+    private void invokeLfcleCallbacks(Cb cbType, Component component) {
+        m_refs.computeIfPresent(cbType, (k, mrefs) -> {
+            mrefs.forEach(mref -> mref.accept(null, component));
+            return mrefs;
+         });
     }
 
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java?rev=1724881&r1=1724880&r2=1724881&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/FactoryPidAdapterBuilderImpl.java
 Fri Jan 15 21:43:31 2016
@@ -5,8 +5,6 @@ import java.util.Dictionary;
 import java.util.List;
 import java.util.Objects;
 import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Supplier;
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
@@ -18,10 +16,7 @@ import org.apache.felix.dm.builder.lambd
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeComponentDictionary;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeDictionary;
 
-public class FactoryPidAdapterBuilderImpl<T> implements 
-        AdapterBase<T, FactoryPidAdapterBuilder<T>>, 
-        FactoryPidAdapterBuilder<T>    
-{
+public class FactoryPidAdapterBuilderImpl implements 
AdapterBase<FactoryPidAdapterBuilder>, FactoryPidAdapterBuilder {
     private String m_factoryPid;
     private boolean m_propagate;
     private final DependencyManager m_dm;
@@ -30,7 +25,7 @@ public class FactoryPidAdapterBuilderImp
     private Object m_updateCallbackInstance;
     private boolean m_hasMethodRefs;
     private boolean m_hasReflectionCallback;
-    private Consumer<ComponentBuilder<T>> m_compBuilder = (componentBuilder -> 
{});
+    private Consumer<ComponentBuilder> m_compBuilder = (componentBuilder -> 
{});
     private final List<MethodRef<Object>> m_refs = new ArrayList<>();
 
     @FunctionalInterface
@@ -42,54 +37,18 @@ public class FactoryPidAdapterBuilderImp
         m_dm = dm;
     }
     
-    public void andThenBuild(Consumer<ComponentBuilder<T>> builder) {
+    public void andThenBuild(Consumer<ComponentBuilder> builder) {
         m_compBuilder = m_compBuilder.andThen(builder);
     }
 
-    @SuppressWarnings("unchecked")
-    public <U> FactoryPidAdapterBuilder<U> impl(U impl) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.impl(impl));
-        return (FactoryPidAdapterBuilder<U>) this; 
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U> FactoryPidAdapterBuilder<U> impl(Class<U> implClass) {        
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.impl(implClass));
-        return (FactoryPidAdapterBuilder<U>) this; 
-    }
-
-    @SuppressWarnings("unchecked")
-    public <U> FactoryPidAdapterBuilder<U> factory(Supplier<U> create) {       
 
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(create));
-        return (FactoryPidAdapterBuilder<U>) this; 
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U, V> FactoryPidAdapterBuilder<V> factory(Supplier<U> factory, 
Function<U, V> create) {        
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, create));
-        return (FactoryPidAdapterBuilder<V>) this; 
-    }
-        
-    @SuppressWarnings("unchecked")
-    public <U> FactoryPidAdapterBuilder<U> factory(Supplier<U> factory, 
Supplier<Object[]> getComposition) {        
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, getComposition));
-        return (FactoryPidAdapterBuilder<U>) this; 
-    }
-
-    @SuppressWarnings("unchecked")
-    public <U, V> FactoryPidAdapterBuilder<V> factory(Supplier<U> factory, 
Function<U, V> create, Function<U, Object[]> getComposition) {       
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, create, getComposition));
-        return (FactoryPidAdapterBuilder<V>) this; 
-    }
-
     @Override
-    public FactoryPidAdapterBuilderImpl<T> autoAdd(boolean autoAdd) {
+    public FactoryPidAdapterBuilderImpl autoAdd(boolean autoAdd) {
         m_autoAdd = autoAdd;
         return this;
     }
     
     @Override
-    public FactoryPidAdapterBuilderImpl<T> autoAdd() {
+    public FactoryPidAdapterBuilderImpl autoAdd() {
         m_autoAdd = true;
         return this;
     }
@@ -99,61 +58,61 @@ public class FactoryPidAdapterBuilderImp
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> factoryPid(String pid) {
+    public FactoryPidAdapterBuilder factoryPid(String pid) {
         m_factoryPid = pid;
         return this;
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> factoryPid(Class<?> pidClass) {
+    public FactoryPidAdapterBuilder factoryPid(Class<?> pidClass) {
         m_factoryPid = pidClass.getName();
         return this;
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> propagate() {
+    public FactoryPidAdapterBuilder propagate() {
         m_propagate = true;
         return this;
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> propagate(boolean propagate) {
+    public FactoryPidAdapterBuilder propagate(boolean propagate) {
         m_propagate = propagate;
         return this;
     }
 
-    public FactoryPidAdapterBuilder<T> cb(String update) {
+    public FactoryPidAdapterBuilder cb(String update) {
         checkHasNoMethodRefs();
         m_hasReflectionCallback = true;
         m_updateMethodName = update;
         return this;
     }
     
-    public FactoryPidAdapterBuilder<T> cb(Object callbackInstance, String 
update) {
+    public FactoryPidAdapterBuilder cb(Object callbackInstance, String update) 
{
         cb(update);
         m_updateCallbackInstance = callbackInstance;
         return this;
     }
     
     @Override
-    public <U> FactoryPidAdapterBuilder<T> cb(CbTypeDictionary<U> callback) {
+    public <U> FactoryPidAdapterBuilder cb(CbTypeDictionary<U> callback) {
         Class<U> type = Helpers.getLambdaGenericType(callback, 0);
         return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((U) instance, props); });
     }
     
     @Override
-    public <U> FactoryPidAdapterBuilder<T> cb(CbTypeComponentDictionary<U> 
callback) {
+    public <U> FactoryPidAdapterBuilder cb(CbTypeComponentDictionary<U> 
callback) {
         Class<U> type = Helpers.getLambdaGenericType(callback, 0);
         return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((U) instance, component, props); });
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> cbi(CbDictionary callback) {
+    public FactoryPidAdapterBuilder cbi(CbDictionary callback) {
         return setInstanceCallbackRef((instance, component, props) -> { 
callback.accept(props); });
     }
 
     @Override
-    public FactoryPidAdapterBuilder<T> cbi(CbComponentDictionary callback) {
+    public FactoryPidAdapterBuilder cbi(CbComponentDictionary callback) {
         return setInstanceCallbackRef((instance, component, props) -> { 
callback.accept(component, props); });
     }
 
@@ -173,12 +132,12 @@ public class FactoryPidAdapterBuilderImp
         } else {
             c = m_dm.createFactoryConfigurationAdapterService(m_factoryPid, 
m_updateMethodName, m_propagate, m_updateCallbackInstance);
         }
-        ComponentBuilderImpl<T> cb = new ComponentBuilderImpl<>(c, false);
+        ComponentBuilderImpl cb = new ComponentBuilderImpl(c, false);
         m_compBuilder.accept (cb);
         return cb.build();
     }
     
-    private <U> FactoryPidAdapterBuilder<T> 
setInstanceCallbackRef(MethodRef<U> ref) {
+    private <U> FactoryPidAdapterBuilder setInstanceCallbackRef(MethodRef<U> 
ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
         m_refs.add((instance, component, props) -> ref.accept(null, component, 
props));
@@ -186,7 +145,7 @@ public class FactoryPidAdapterBuilderImp
     }
     
     @SuppressWarnings("unchecked")
-    private <U> FactoryPidAdapterBuilder<T> setComponentCallbackRef(Class<U> 
type, MethodRef<U> ref) {
+    private <U> FactoryPidAdapterBuilder setComponentCallbackRef(Class<U> 
type, MethodRef<U> ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
         m_refs.add((instance, component, props) -> {

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.java?rev=1724881&r1=1724880&r2=1724881&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAdapterBuilderImpl.java
 Fri Jan 15 21:43:31 2016
@@ -10,16 +10,16 @@ import org.apache.felix.dm.DependencyMan
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ServiceAdapterBuilder;
 
-public class ServiceAdapterBuilderImpl<T, C> extends 
ServiceCallbacksBuilderImpl<T, ServiceAdapterBuilderImpl<T, C>> implements
-    AdapterBase<C, ServiceAdapterBuilder<T, C>>, 
-    ServiceAdapterBuilder<T, C> 
+public class ServiceAdapterBuilderImpl<T> extends 
ServiceCallbacksBuilderImpl<T, ServiceAdapterBuilderImpl<T>> implements
+    AdapterBase<ServiceAdapterBuilder<T>>, 
+    ServiceAdapterBuilder<T> 
 {      
     private final Class<?> m_adapteeType;
     private String m_adapteeFilter;
     private boolean m_propagate = true;
     private final DependencyManager m_dm;
     private boolean m_autoAdd = true;
-    private Consumer<ComponentBuilder<C>> m_compBuilder = (componentBuilder -> 
{});
+    private Consumer<ComponentBuilder> m_compBuilder = (componentBuilder -> 
{});
 
     public ServiceAdapterBuilderImpl(DependencyManager dm, Class<T> type) {
         super(type);
@@ -28,53 +28,17 @@ public class ServiceAdapterBuilderImpl<T
     }    
 
     @Override
-    public void andThenBuild(Consumer<ComponentBuilder<C>> after) {
+    public void andThenBuild(Consumer<ComponentBuilder> after) {
         m_compBuilder = m_compBuilder.andThen(after);        
     }
 
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAdapterBuilder<T, U> impl(U impl) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.impl(impl));
-        return (ServiceAdapterBuilder<T, U>) this;
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAdapterBuilder<T, U> impl(Class<U> impl) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.impl(impl));
-        return (ServiceAdapterBuilder<T, U>) this;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAdapterBuilder<T, U> factory(Supplier<U> create) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(create));
-        return (ServiceAdapterBuilder<T, U>) this;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <U, V> ServiceAdapterBuilder<T, V> factory(Supplier<U> factory, 
Function<U, V> create) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, create));
-        return (ServiceAdapterBuilder<T, V>) this;
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAdapterBuilder<T, U> factory(Supplier<U> factory, 
Supplier<Object[]> getComposition) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, getComposition));
-        return (ServiceAdapterBuilder<T, U>) this;
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U, V> ServiceAdapterBuilder<T, V> factory(Supplier<U> factory, 
Function<U, V> create, Function<U, Object[]> getComposition) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, create, getComposition));
-        return (ServiceAdapterBuilder<T, V>) this;
-    }
-
     @Override
-    public ServiceAdapterBuilderImpl<T, C> autoAdd(boolean autoAdd) {
+    public ServiceAdapterBuilderImpl<T> autoAdd(boolean autoAdd) {
         m_autoAdd = autoAdd;
         return this;
     }
     
-    public ServiceAdapterBuilderImpl<T, C> autoAdd() {
+    public ServiceAdapterBuilderImpl<T> autoAdd() {
         m_autoAdd = true;
         return this;
     }
@@ -84,19 +48,19 @@ public class ServiceAdapterBuilderImpl<T
     }
     
     @Override
-    public ServiceAdapterBuilder<T, C> filter(String adapteeFilter) {
+    public ServiceAdapterBuilder<T> filter(String adapteeFilter) {
         m_adapteeFilter = adapteeFilter;
         return this;
     }
 
     @Override
-    public ServiceAdapterBuilder<T, C> propagate() {
+    public ServiceAdapterBuilder<T> propagate() {
         m_propagate = true;
         return this;
     }
 
     @Override
-    public ServiceAdapterBuilder<T, C> propagate(boolean propagate) {
+    public ServiceAdapterBuilder<T> propagate(boolean propagate) {
         m_propagate = propagate;
         return this;
     }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAspectBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAspectBuilderImpl.java?rev=1724881&r1=1724880&r2=1724881&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAspectBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceAspectBuilderImpl.java
 Fri Jan 15 21:43:31 2016
@@ -10,16 +10,16 @@ import org.apache.felix.dm.DependencyMan
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.ServiceAspectBuilder;
 
-public class ServiceAspectBuilderImpl<T, C> extends 
ServiceCallbacksBuilderImpl<T, ServiceAspectBuilderImpl<T, C>> implements
-    AdapterBase<C, ServiceAspectBuilder<T, C>>, 
-    ServiceAspectBuilder<T, C> 
+public class ServiceAspectBuilderImpl<T> extends 
ServiceCallbacksBuilderImpl<T, ServiceAspectBuilderImpl<T>> implements
+    AdapterBase<ServiceAspectBuilder<T>>, 
+    ServiceAspectBuilder<T> 
 {    
     private final DependencyManager m_dm;
     private final Class<?> m_aspectType;
     private String m_aspectFilter;
     private int m_aspectRanking;
     private boolean m_autoAdd = true;
-    private Consumer<ComponentBuilder<C>> m_compBuilder = (componentBuilder -> 
{});
+    private Consumer<ComponentBuilder> m_compBuilder = (componentBuilder -> 
{});
 
     public ServiceAspectBuilderImpl(DependencyManager dm, Class<T> type) {
         super(type);
@@ -28,54 +28,18 @@ public class ServiceAspectBuilderImpl<T,
     }
 
     @Override
-    public void andThenBuild(Consumer<ComponentBuilder<C>> after) {
+    public void andThenBuild(Consumer<ComponentBuilder> after) {
         m_compBuilder = m_compBuilder.andThen(after);        
     }
 
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAspectBuilderImpl<T, U> impl(U impl) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.impl(impl));
-        return (ServiceAspectBuilderImpl<T, U>) this;
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAspectBuilderImpl<T, U> impl(Class<U> impl) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.impl(impl));
-        return (ServiceAspectBuilderImpl<T, U>) this;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAspectBuilderImpl<T, U> factory(Supplier<U> create) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(create));
-        return (ServiceAspectBuilderImpl<T, U>) this;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <U, V> ServiceAspectBuilderImpl<T, V> factory(Supplier<U> factory, 
Function<U, V> create) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, create));
-        return (ServiceAspectBuilderImpl<T, V>) this;
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <U> ServiceAspectBuilderImpl<T, U> factory(Supplier<U> factory, 
Supplier<Object[]> getComposition) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, getComposition));
-        return (ServiceAspectBuilderImpl<T, U>) this;
-    }
-    
-    @SuppressWarnings("unchecked")
-   public <U, V> ServiceAspectBuilderImpl<T, V> factory(Supplier<U> factory, 
Function<U, V> create, Function<U, Object[]> getComposition) {
-        m_compBuilder = m_compBuilder.andThen(compBuilder -> 
compBuilder.factory(factory, create, getComposition));
-        return (ServiceAspectBuilderImpl<T, V>) this;
-    }
- 
     @Override
-    public ServiceAspectBuilderImpl<T, C> autoAdd(boolean autoAdd) {
+    public ServiceAspectBuilderImpl<T> autoAdd(boolean autoAdd) {
         m_autoAdd = autoAdd;
         return this;
     }
     
     @Override
-    public ServiceAspectBuilderImpl<T, C> autoAdd() {
+    public ServiceAspectBuilderImpl<T> autoAdd() {
         m_autoAdd = true;
         return this;
     }
@@ -85,13 +49,13 @@ public class ServiceAspectBuilderImpl<T,
     }
 
     @Override
-    public ServiceAspectBuilder<T, C> filter(String aspectFilter) {
+    public ServiceAspectBuilder<T> filter(String aspectFilter) {
         m_aspectFilter = aspectFilter;
         return this;
     }
 
     @Override
-    public ServiceAspectBuilder<T, C> rank(int ranking) {
+    public ServiceAspectBuilder<T> rank(int ranking) {
         m_aspectRanking = ranking;
         return this;
     }
@@ -119,7 +83,7 @@ public class ServiceAspectBuilderImpl<T,
         } else {
             c = m_dm.createAspectService(m_aspectType, m_aspectFilter, 
m_aspectRanking);
         }
-        ComponentBuilderImpl<C> cb = new ComponentBuilderImpl<>(c, false);
+        ComponentBuilderImpl cb = new ComponentBuilderImpl(c, false);
         // m_compBuilder is a composed consumer that calls in sequence all 
necessary component builder methods. 
         m_compBuilder.accept (cb);
         return cb.build();

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java?rev=1724881&r1=1724880&r2=1724881&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 Fri Jan 15 21:43:31 2016
@@ -63,7 +63,7 @@ public abstract class ServiceCallbacksBu
        /**
         * List of service (add/change/remove) callbacks.
         */
-    protected final Map<String, List<MethodRef<Object, S>>> m_refs = new 
HashMap<>();
+    protected final Map<Cb, List<MethodRef<Object, S>>> m_refs = new 
HashMap<>();
 
        /**
         * List of swap callbacks
@@ -157,112 +157,112 @@ public abstract class ServiceCallbacksBu
        }
 
     public <T> B cb(Cb cbType, CbTypeService<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, service));
     }
     
     public <T> B cb(Cb cbType, CbTypeServiceMap<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, service, new SRefAsMap(ref)));
     }
 
     public <T> B cb(Cb cbType, CbTypeServiceDict<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, service, new SRefAsDictionary(ref))); 
     }
     
     public <T> B cb(Cb cbType, CbTypeRef<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, ref)); 
     }
 
     public <T> B cb(Cb cbType, CbTypeRefService<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, ref, service)); 
     }
 
     public <T> B cb(Cb cbType, CbTypeComponent<T> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, component)); 
     }
 
     public <T> B cb(Cb cbType, CbTypeComponentService<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, component, service)); 
     }
 
     public <T> B cb(Cb cbType, CbTypeComponentServiceMap<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, component, service, new SRefAsMap(ref))); 
     }
 
     public <T> B cb(Cb cbType, CbTypeComponentServiceDict<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, component, service, new SRefAsDictionary(ref)));  
     }
 
     public <T> B cb(Cb cbType, CbTypeComponentRef<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, component, ref));  
     }
 
     public <T> B cb(Cb cbType, CbTypeComponentRefService<T, S> callback) {
-        return setComponentCallbackRef(cbType.getCallback(), 
Helpers.getLambdaGenericType(callback, 0), 
+        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
             (instance, component, ref, service) -> callback.accept((T) 
instance, component, ref, service));   
     }
 
     public B cbi(Cb cbType, CbService<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(service));  
 
     }
     
     public B cbi(Cb cbType, CbServiceMap<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(service, 
new SRefAsMap(ref)));   
     }
 
     public B cbi(Cb cbType, CbServiceDict<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(service, 
new SRefAsDictionary(ref)));   
     }
 
     public B cbi(Cb cbType, CbRef<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(ref));   
     }
 
     public B cbi(Cb cbType, CbRefService<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(ref, 
service));   
     }
 
     public B cbi(Cb cbType, CbComponent callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> 
callback.accept(component));   
     }
 
     public B cbi(Cb cbType, CbComponentService<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(component, 
service));   
     }
 
     public B cbi(Cb cbType, CbComponentServiceMap<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(component, 
service, new SRefAsMap(ref)));           
     }
 
     public B cbi(Cb cbType, CbComponentServiceDict<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(component, 
service, new SRefAsDictionary(ref)));           
     }
 
     public B cbi(Cb cbType, CbComponentRef<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(component, 
ref));           
     }
 
     public B cbi(Cb cbType, CbComponentRefService<S> callback) {
-        return setInstanceCallbackRef(cbType.getCallback(), 
+        return setInstanceCallbackRef(cbType, 
             (instance, component, ref, service) -> callback.accept(component, 
ref, service));           
     }
 
@@ -308,10 +308,11 @@ public abstract class ServiceCallbacksBu
             swap.accept(new SRefAsDictionary(oref), oserv, new 
SRefAsDictionary(nref), nserv));
     }
     
-    protected <I> B setComponentCallbackRef(String cb, Class<I> type, 
MethodRef<I, S> ref) {
+    protected <I> B setComponentCallbackRef(Cb cbType, Class<I> type, 
MethodRef<I, S> ref) {
+       cbType.ensureServiceCallback();
        requiresNoCallbacks();
        if (! m_autoConfigInvoked) m_autoConfig = false;
-       List<MethodRef<Object, S>> list = m_refs.computeIfAbsent(cb, l -> new 
ArrayList<>());
+       List<MethodRef<Object, S>> list = m_refs.computeIfAbsent(cbType, l -> 
new ArrayList<>());
        list.add((instance, component, sref, service) -> {
            Stream.of(component.getInstances()).forEach(inst -> {
                if (Helpers.getClass(inst).equals(type)) {
@@ -322,10 +323,11 @@ public abstract class ServiceCallbacksBu
        return (B) this;
     }
 
-    protected <T> B setInstanceCallbackRef(String cb, MethodRef<T, S> ref) {
+    protected <T> B setInstanceCallbackRef(Cb cbType, MethodRef<T, S> ref) {
+        cbType.ensureServiceCallback();
         requiresNoCallbacks();
         if (! m_autoConfigInvoked) m_autoConfig = false;
-        List<MethodRef<Object, S>> list = m_refs.computeIfAbsent(cb, l -> new 
ArrayList<>());
+        List<MethodRef<Object, S>> list = m_refs.computeIfAbsent(cbType, l -> 
new ArrayList<>());
         list.add((instance, component, sref, service) -> {
             ref.accept((T) component.getInstance(), component, sref, service);
         });
@@ -359,15 +361,15 @@ public abstract class ServiceCallbacksBu
        
        cb = new Object() {
            void add(Component c, ServiceReference<S> ref, Object service) {
-               invokeMethodRefs("add", c, ref, (S) service);
+               invokeMethodRefs(Cb.ADD, c, ref, (S) service);
            }
 
            void change(Component c, ServiceReference<S> ref, Object service) {
-               invokeMethodRefs("change", c, ref, (S) service);
+               invokeMethodRefs(Cb.CHG, c, ref, (S) service);
            }
 
            void remove(Component c, ServiceReference<S> ref, Object service) {
-               invokeMethodRefs("remove", c, ref, (S) service);
+               invokeMethodRefs(Cb.REM, c, ref, (S) service);
            }
 
            void swap(Component c, ServiceReference<S> oldRef, Object oldSrv, 
ServiceReference<S> newRef, Object newSrv) {                
@@ -386,8 +388,8 @@ public abstract class ServiceCallbacksBu
        return m_callbackInstance != null || m_added != null || m_changed != 
null || m_removed != null || m_swapped != null;
     }
       
-    private void invokeMethodRefs(String method, Component comp, 
ServiceReference<S> ref, S service) {
-          m_refs.computeIfPresent(method, (k, mrefs) -> {
+    private void invokeMethodRefs(Cb cbType, Component comp, 
ServiceReference<S> ref, S service) {
+          m_refs.computeIfPresent(cbType, (k, mrefs) -> {
                   mrefs.forEach(mref -> mref.accept(null, comp, ref, service));
                   return mrefs;
                });


Reply via email to