Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
 Thu Jan 21 22:52:22 2016
@@ -60,32 +60,68 @@ public interface ServiceCallbacksBuilder
     B cb(String ... callbacks);
     B cbi(Object callbackInstance, String ... callbacks);
 
-    <T> B cb(Cb callbackType, CbTypeService<T, S> callback);
-    B cbi(Cb callbackType, CbService<S> callback);
+    <T> B cb(CbTypeService<T, S> add);
+    <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> remove);
+    <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> change, 
CbTypeService<T, S> remove);
+    B cbi(CbService<S> add);
+    B cbi(CbService<S> add, CbService<S> remove);
+    B cbi(CbService<S> add, CbService<S> change, CbService<S> remove);
 
-    <T> B cb(Cb callbackType, CbTypeServiceMap<T, S> callback);
-    B cbi(Cb callbackType, CbServiceMap<S> callback);
-    
-    <T> B cb(Cb callbackType, CbTypeServiceDict<T, S> callback);
-    B cbi(Cb callbackType, CbServiceDict<S> callback);
-    
-    <T> B cb(Cb callbackType, CbTypeRefService<T, S> callback);
-    B cbi(Cb callbackType, CbRefService<S> callback);
-    
-    <T> B cb(Cb callbackType, CbTypeRef<T, S> callback);
-    B cbi(Cb callbackType, CbRef<S> callback);
-    
-    <T> B cb(Cb callbackType, CbTypeComponent<T> callback);
-    B cbi(Cb callbackType, CbComponent callback);
-    
-    <T> B cb(Cb callbackType, CbTypeComponentRef<T, S> callback);
-    B cbi(Cb callbackType, CbComponentRef<S> callback);
-    
-    <T> B cb(Cb callbackType, CbTypeComponentService<T, S> callback);
-    B cbi(Cb callbackType, CbComponentRefService<S> callback);
-    
-    <T> B cb(Cb callbackType, CbTypeComponentRefService<T, S> callback);
-    B cbi(Cb callbackType, CbComponentService<S> callback);    
+    <T> B cb(CbTypeServiceMap<T, S> add);
+    <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> remove);
+    <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> change, 
CbTypeServiceMap<T, S> remove);
+    B cbi(CbServiceMap<S> add);
+    B cbi(CbServiceMap<S> add, CbServiceMap<S> remove);
+    B cbi(CbServiceMap<S> add, CbServiceMap<S> change, CbServiceMap<S> remove);
+
+    <T> B cb(CbTypeServiceDict<T, S> add);
+    <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> remove);
+    <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> change, 
CbTypeServiceDict<T, S> remove);
+    B cbi(CbServiceDict<S> add);
+    B cbi(CbServiceDict<S> add, CbServiceDict<S> remove);
+    B cbi(CbServiceDict<S> add, CbServiceDict<S> change, CbServiceDict<S> 
remove);
+
+    <T> B cb(CbTypeRefService<T, S> add);
+    <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> remove);
+    <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> change, 
CbTypeRefService<T, S> remove);
+    B cbi(CbRefService<S> add);
+    B cbi(CbRefService<S> add, CbRefService<S> remove);
+    B cbi(CbRefService<S> add, CbRefService<S> change, CbRefService<S> remove);
+
+    <T> B cb(CbTypeRef<T, S> add);
+    <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> remove);
+    <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> change, CbTypeRef<T, S> 
remove);
+    B cbi(CbRef<S> add);
+    B cbi(CbRef<S> add, CbRef<S> remove);
+    B cbi(CbRef<S> add, CbRef<S> change, CbRef<S> remove);
+
+    <T> B cb(CbTypeComponent<T> add);
+    <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> remove);
+    <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> change, 
CbTypeComponent<T> remove);
+    B cbi(CbComponent add);
+    B cbi(CbComponent add, CbComponent remove);
+    B cbi(CbComponent add, CbComponent change, CbComponent remove);
+
+    <T> B cb(CbTypeComponentRef<T, S> add);
+    <T> B cb(CbTypeComponentRef<T, S> add, CbTypeComponentRef<T, S> remove);
+    <T> B cb(CbTypeComponentRef<T, S> add, CbTypeComponentRef<T, S> change, 
CbTypeComponentRef<T, S> remove);
+    B cbi(CbComponentRef<S> add);
+    B cbi(CbComponentRef<S> add, CbComponentRef<S> remove);
+    B cbi(CbComponentRef<S> add, CbComponentRef<S> change, CbComponentRef<S> 
remove);
+
+    <T> B cb(CbTypeComponentService<T, S> add);
+    <T> B cb(CbTypeComponentService<T, S> add, CbTypeComponentService<T, S> 
remove);
+    <T> B cb(CbTypeComponentService<T, S> add, CbTypeComponentService<T, S> 
change, CbTypeComponentService<T, S> remove);
+    B cbi(CbComponentService<S> add);    
+    B cbi(CbComponentService<S> add, CbComponentService<S> remove);
+    B cbi(CbComponentService<S> add, CbComponentService<S> change, 
CbComponentService<S> remove);
+
+    <T> B cb(CbTypeComponentRefService<T, S> add);
+    <T> B cb(CbTypeComponentRefService<T, S> add, CbTypeComponentRefService<T, 
S> remove);
+    <T> B cb(CbTypeComponentRefService<T, S> add, CbTypeComponentRefService<T, 
S> change, CbTypeComponentRefService<T, S> remove);
+    B cbi(CbComponentRefService<S> add);
+    B cbi(CbComponentRefService<S> add, CbComponentRefService<S> remove);
+    B cbi(CbComponentRefService<S> add, CbComponentRefService<S> change, 
CbComponentRefService<S> remove);
     
     <T> B sw(CbTypeServiceService<T, S> swap);
     B swi(CbServiceService<S> swap);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.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/AdapterBase.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBase.java
 Thu Jan 21 22:52:22 2016
@@ -7,7 +7,6 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 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.Functions.CbComponent;
@@ -167,8 +166,8 @@ public interface AdapterBase<B extends C
         return (B) this;
     }
 
-    default B withService(Class<?> service, Class<?> ... services) {
-        andThenBuild(compBuilder -> compBuilder.withService(service, 
services));
+    default B withService(Class<?> ... services) {
+        andThenBuild(compBuilder -> compBuilder.withService(services));
         return (B) this;
     }
 
@@ -177,8 +176,8 @@ public interface AdapterBase<B extends C
         return (B) this;
     }
     
-    default B withConfiguration(Consumer<ConfigurationDependencyBuilder> 
consumer) {
-        andThenBuild(compBuilder -> compBuilder.withConfiguration(consumer));
+    default B withConf(Consumer<ConfigurationDependencyBuilder> consumer) {
+        andThenBuild(compBuilder -> compBuilder.withConf(consumer));
         return (B) this;
     }
     

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.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/BundleAdapterBuilderImpl.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleAdapterBuilderImpl.java
 Thu Jan 21 22:52:22 2016
@@ -10,7 +10,6 @@ import java.util.stream.Stream;
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.builder.lambda.BundleAdapterBuilder;
-import org.apache.felix.dm.builder.lambda.Cb;
 import org.apache.felix.dm.builder.lambda.ComponentBuilder;
 import org.apache.felix.dm.builder.lambda.Functions.CbBundle;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentBundle;
@@ -34,6 +33,12 @@ public class BundleAdapterBuilderImpl im
     private String m_change;
     private String m_remove;
 
+    enum Cb {
+        ADD,        
+        CHG,        
+        REM
+    };
+
     @FunctionalInterface
     interface MethodRef<I> {
         public void accept(I instance, Component c, Bundle b);
@@ -112,23 +117,83 @@ public class BundleAdapterBuilderImpl im
         m_remove = remove;
         return this;
     }
+    
+    public <T> BundleAdapterBuilder cb(CbTypeBundle<T> add) {
+        return cb(add, null, null);
+    }
+
+    public <T> BundleAdapterBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> 
remove) {
+        return cb(add, null, remove);
+    }
+
+    public <T> BundleAdapterBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> 
change, CbTypeBundle<T> remove) {
+        if (add != null) {
+            Class<T> type = Helpers.getLambdaArgType(add, 0);
+            setComponentCallbackRef(Cb.ADD, type, (instance, component, 
bundle) -> { add.accept((T) instance, bundle); });
+        }
+        if (change != null) {
+            Class<T> type = Helpers.getLambdaArgType(change, 0);
+            setComponentCallbackRef(Cb.CHG, type, (instance, component, 
bundle) -> { change.accept((T) instance, bundle); });
+        }
+        if (remove != null) {
+            Class<T> type = Helpers.getLambdaArgType(remove, 0);
+            setComponentCallbackRef(Cb.REM, type, (instance, component, 
bundle) -> { remove.accept((T) instance, bundle); });
+        }
+        return this;
+    }
+    
+    public BundleAdapterBuilder cbi(CbBundle add) {
+        return cbi(add, null, null);
+    }
 
-    public <T> BundleAdapterBuilder cb(Cb callbackType, CbTypeBundle<T> 
callback) {
-        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
-        return setComponentCallbackRef(callbackType, type, (instance, 
component, bundle) -> { callback.accept((T) instance, bundle); });
+    public BundleAdapterBuilder cbi(CbBundle add, CbBundle remove) {
+        return cbi(add, null, remove);
     }
     
-    public <T> BundleAdapterBuilder cb(Cb callbackType, 
CbTypeComponentBundle<T> callback) {
-        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
-        return setComponentCallbackRef(callbackType, type, (instance, 
component, bundle) -> { callback.accept((T) instance, component, bundle); });
+    public BundleAdapterBuilder cbi(CbBundle add, CbBundle change, CbBundle 
remove) {
+        if (add != null) setInstanceCallbackRef(Cb.ADD, (instance, component, 
bundle) -> { add.accept(bundle); });
+        if (change != null) setInstanceCallbackRef(Cb.CHG, (instance, 
component, bundle) -> { change.accept(bundle); });
+        if (remove != null) setInstanceCallbackRef(Cb.REM, (instance, 
component, bundle) -> { remove.accept(bundle); });
+        return this;
     }
     
-    public BundleAdapterBuilder cbi(Cb callbackType, CbBundle callback) {
-        return setInstanceCallbackRef(callbackType, (instance, component, 
bundle) -> { callback.accept(bundle); });
+    public <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add) {
+        return cb(add, null, null);
     }
     
-    public BundleAdapterBuilder cbi(Cb callbackType, CbComponentBundle 
callback) {
-        return setInstanceCallbackRef(callbackType, (instance, component, 
bundle) -> { callback.accept(component, bundle); });
+    public <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add, 
CbTypeComponentBundle<T> remove) {
+        return cb(add, null, remove);
+    }
+    
+    public <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add, 
CbTypeComponentBundle<T> change, CbTypeComponentBundle<T> remove) {
+        if (add != null) {
+            Class<T> type = Helpers.getLambdaArgType(add, 0);
+            return setComponentCallbackRef(Cb.ADD, type, (instance, component, 
bundle) -> { add.accept((T) instance, component, bundle); });
+        }
+        if (change != null) {
+            Class<T> type = Helpers.getLambdaArgType(change, 0);
+            return setComponentCallbackRef(Cb.CHG, type, (instance, component, 
bundle) -> { change.accept((T) instance, component, bundle); });
+        }
+        if (remove != null) {
+            Class<T> type = Helpers.getLambdaArgType(remove, 0);
+            return setComponentCallbackRef(Cb.ADD, type, (instance, component, 
bundle) -> { remove.accept((T) instance, component, bundle); });
+        }
+        return this;
+    }
+    
+    public BundleAdapterBuilder cbi(CbComponentBundle add) {
+        return cbi(add, null, null);
+    }
+    
+    public BundleAdapterBuilder cbi(CbComponentBundle add, CbComponentBundle 
remove) {
+        return cbi(add, null, remove);
+    }
+
+    public BundleAdapterBuilder cbi(CbComponentBundle add, CbComponentBundle 
change, CbComponentBundle remove) {
+        if (add != null) setInstanceCallbackRef(Cb.ADD, (instance, component, 
bundle) -> { add.accept(component, bundle); });
+        if (change != null) setInstanceCallbackRef(Cb.CHG, (instance, 
component, bundle) -> { change.accept(component, bundle); });
+        if (remove != null) setInstanceCallbackRef(Cb.REM, (instance, 
component, bundle) -> { remove.accept(component, bundle); });
+        return this;
     }
 
     @Override
@@ -168,7 +233,6 @@ public class BundleAdapterBuilderImpl im
     
     @SuppressWarnings("unchecked")
     private <U> BundleAdapterBuilder setComponentCallbackRef(Cb cbType, 
Class<U> type, MethodRef<U> ref) {
-        cbType.ensureServiceCallback();
         checkHasNoReflectionCallbacks();
         List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
         list.add((instance, component, bundle) -> {

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.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/BundleDependencyBuilderImpl.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
 Thu Jan 21 22:52:22 2016
@@ -13,7 +13,6 @@ import org.apache.felix.dm.BundleDepende
 import org.apache.felix.dm.Component;
 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.Functions.CbBundle;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentBundle;
 import org.apache.felix.dm.builder.lambda.Functions.CbTypeBundle;
@@ -38,6 +37,12 @@ public class BundleDependencyBuilderImpl
        private Supplier<Dictionary<?, ?>> m_propagateSupplier;
        private final Component m_component;
     
+    enum Cb {
+        ADD,        
+        CHG,        
+        REM
+    };
+
        private final Map<Cb, List<MethodRef<Object>>> m_refs = new HashMap<>();
 
     @FunctionalInterface
@@ -169,25 +174,87 @@ public class BundleDependencyBuilderImpl
     }
 
     @Override
-    public <T> BundleDependencyBuilder cb(Cb callbackType, CbTypeBundle<T> 
callback) {      
-        return setComponentCallbackRef(callbackType, 
Helpers.getLambdaGenericType(callback, 0),
-            (inst, component, bundle) -> callback.accept ((T) inst, bundle));
+    public <T> BundleDependencyBuilder cb(CbTypeBundle<T> add) {
+        return cb(add, null, null);
+    }
+    
+    @Override
+    public <T> BundleDependencyBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> 
remove) {
+        return cb(add, null, remove);
+    }
+    
+    @Override
+    public <T> BundleDependencyBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> 
change, CbTypeBundle<T> remove) {
+        if (add != null) {
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, component, bundle) -> add.accept ((T) inst, bundle));
+        }
+        if (change != null) {
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, component, bundle) -> change.accept ((T) inst, bundle));
+        }
+        if (remove != null) {
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, component, bundle) -> remove.accept ((T) inst, bundle));
+        }
+        return this;
     }
 
     @Override
-    public <T> BundleDependencyBuilder cb(Cb callbackType, 
CbTypeComponentBundle<T> callback) {
-        return setComponentCallbackRef(callbackType, 
Helpers.getLambdaGenericType(callback, 0),
-            (inst, component, bundle) -> callback.accept ((T) inst, component, 
bundle));
+    public <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add) {
+        return cb(add, null, null);
+    }
+    
+    @Override
+    public <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add, 
CbTypeComponentBundle<T> remove) {
+        return cb(add, null, remove);
+    }
+    
+    @Override
+    public <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add, 
CbTypeComponentBundle<T> change, CbTypeComponentBundle<T> remove) {
+        if (add != null) {
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, component, bundle) -> add.accept ((T) inst, component, bundle));
+        }
+        if (change != null) {
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, component, bundle) -> change.accept ((T) inst, component, bundle));
+        }
+        if (remove != null) {
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, component, bundle) -> remove.accept ((T) inst, component, bundle));
+        }
+        return this;  
     }
     
     @Override
-    public BundleDependencyBuilder cbi(Cb callbackType, CbBundle callback) {
-        return setInstanceCallbackRef(callbackType, (inst, component, bundle) 
-> callback.accept(bundle));
+    public BundleDependencyBuilder cbi(CbBundle add) {
+        return cbi(add, null, null);
+    }
+    
+    @Override
+    public BundleDependencyBuilder cbi(CbBundle add, CbBundle remove) {
+        return cbi(add, null, remove);
+    }
+    
+    @Override
+    public BundleDependencyBuilder cbi(CbBundle add, CbBundle change, CbBundle 
remove) {
+        if (add != null) setInstanceCallbackRef(Cb.ADD, (inst, component, 
bundle) -> add.accept(bundle));
+        if (change != null) setInstanceCallbackRef(Cb.CHG, (inst, component, 
bundle) -> change.accept(bundle));
+        if (remove != null) setInstanceCallbackRef(Cb.REM, (inst, component, 
bundle) -> remove.accept(bundle));
+        return this;
     }
 
     @Override
-    public BundleDependencyBuilder cbi(Cb callbackType, CbComponentBundle 
callback) {
-        return setInstanceCallbackRef(callbackType, (inst, component, bundle) 
-> callback.accept(component, bundle));
+    public BundleDependencyBuilder cbi(CbComponentBundle add) {
+        return cbi(add, null, null);
+    }
+    
+    @Override
+    public BundleDependencyBuilder cbi(CbComponentBundle add, 
CbComponentBundle remove) {
+        return cbi(add, null, remove);
+    }
+    
+    @Override
+    public BundleDependencyBuilder cbi(CbComponentBundle add, 
CbComponentBundle change, CbComponentBundle remove) {
+        if (add != null) setInstanceCallbackRef(Cb.ADD, (inst, component, 
bundle) -> add.accept(component, bundle));
+        if (change != null) setInstanceCallbackRef(Cb.CHG, (inst, component, 
bundle) -> change.accept(component, bundle));
+        if (remove != null) setInstanceCallbackRef(Cb.REM, (inst, component, 
bundle) -> remove.accept(component, bundle));
+        return this;
     }
 
        @Override
@@ -229,7 +296,6 @@ public class BundleDependencyBuilderImpl
        }
 
        private <T> BundleDependencyBuilder setInstanceCallbackRef(Cb cbType, 
MethodRef<T> ref) {
-           cbType.ensureServiceCallback();
                requiresNoStringCallbacks();
                if (! m_autoConfigInvoked) m_autoConfig = false;
                List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l 
-> new ArrayList<>());
@@ -238,7 +304,6 @@ public class BundleDependencyBuilderImpl
        }
        
        private <T> BundleDependencyBuilder setComponentCallbackRef(Cb cbType, 
Class<T> type, MethodRef<T> ref) {
-           cbType.ensureServiceCallback();
            requiresNoStringCallbacks();
                if (! m_autoConfigInvoked) m_autoConfig = false;
                List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l 
-> new ArrayList<>());

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.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/CompletableFutureDependencyImpl.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/CompletableFutureDependencyImpl.java
 Thu Jan 21 22:52:22 2016
@@ -69,7 +69,7 @@ public class CompletableFutureDependency
        @SuppressWarnings("unchecked")
        @Override
        public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> 
consumer, boolean async) {
-           m_accept2Type = Helpers.getLambdaGenericType(consumer, 0);;
+           m_accept2Type = Helpers.getLambdaArgType(consumer, 0);;
            m_accept2 = (instance, result) -> consumer.accept((T) instance, 
result);
            m_async = async;
            return this;

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=1726125&r1=1726124&r2=1726125&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
 Thu Jan 21 22:52:22 2016
@@ -18,7 +18,6 @@ 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;
@@ -379,8 +378,7 @@ public class ComponentBuilderImpl implem
     }   
 
     @Override
-    public ComponentBuilderImpl withService(Class<?> service, Class<?> ... 
services) {
-        doWithService(service);
+    public ComponentBuilderImpl withService(Class<?> ... services) {
         for (Class<?> s : services) {
             doWithService(s);
         }
@@ -401,7 +399,7 @@ public class ComponentBuilderImpl implem
     }   
     
     @Override
-    public ComponentBuilderImpl 
withConfiguration(Consumer<ConfigurationDependencyBuilder> consumer) {
+    public ComponentBuilderImpl 
withConf(Consumer<ConfigurationDependencyBuilder> consumer) {
         ConfigurationDependencyBuilder dep = new 
ConfigurationDependencyBuilderImpl(m_component);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
@@ -462,13 +460,13 @@ public class ComponentBuilderImpl implem
 
     @Override
     public <U> ComponentBuilderImpl life(Cb callbackType, CbConsumer<U> 
callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        Class<U> type = Helpers.getLambdaArgType(callback, 0);
        return setComponentCallbackRef(callbackType, type, (inst, component) -> 
callback.accept((U) inst));
     }
 
     @Override
     public <U> ComponentBuilderImpl life(Cb callbackType, CbTypeComponent<U> 
callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        Class<U> type = Helpers.getLambdaArgType(callback, 0);
         return setComponentCallbackRef(callbackType, type, (inst, component) 
-> callback.accept((U) inst, component));
     }
 
@@ -545,7 +543,6 @@ public class ComponentBuilderImpl implem
 
     protected <U> ComponentBuilderImpl setInstanceCallbackRef(Cb cbType, 
MethodRef<U> ref) {
         ensureHasNoLifecycleMethods();
-        cbType.ensureLifecyleCallback();
         List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
         list.add((instance, component) -> {
             ref.accept(null, component);
@@ -555,7 +552,6 @@ public class ComponentBuilderImpl implem
 
     private <U> ComponentBuilderImpl setComponentCallbackRef(Cb cbType, 
Class<U> type, MethodRef<U> callback) {
         ensureHasNoLifecycleMethods();
-        cbType.ensureLifecyleCallback();
         List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new 
ArrayList<>());
         list.add((instance, component) -> {
             Stream.of(component.getInstances()).forEach(inst -> {

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.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/ConfigurationDependencyBuilderImpl.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ConfigurationDependencyBuilderImpl.java
 Thu Jan 21 22:52:22 2016
@@ -79,13 +79,13 @@ public class ConfigurationDependencyBuil
 
     @Override
     public <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T>  
callback) {
-        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+        Class<T> type = Helpers.getLambdaArgType(callback, 0);
         return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((T) instance, props); });
     }
 
     @Override
     public <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T>  
callback) {
-        Class<T> type = Helpers.getLambdaGenericType(callback, 0);
+        Class<T> type = Helpers.getLambdaArgType(callback, 0);
         return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((T) instance, component, props); });
     }
 

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=1726125&r1=1726124&r2=1726125&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
 Thu Jan 21 22:52:22 2016
@@ -96,13 +96,13 @@ public class FactoryPidAdapterBuilderImp
     
     @Override
     public <U> FactoryPidAdapterBuilder cb(CbTypeDictionary<U> callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        Class<U> type = Helpers.getLambdaArgType(callback, 0);
         return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((U) instance, props); });
     }
     
     @Override
     public <U> FactoryPidAdapterBuilder cb(CbTypeComponentDictionary<U> 
callback) {
-        Class<U> type = Helpers.getLambdaGenericType(callback, 0);
+        Class<U> type = Helpers.getLambdaArgType(callback, 0);
         return setComponentCallbackRef(type, (instance, component, props) -> { 
callback.accept((U) instance, component, props); });
     }
 

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.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/Helpers.java?rev=1726125&r1=1726124&r2=1726125&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/Helpers.java
 Thu Jan 21 22:52:22 2016
@@ -41,7 +41,7 @@ public class Helpers {
         * @return the type of the lambda generic parameter that corresponds to 
the <code>genericParamIndex</code>  
         */
        @SuppressWarnings("unchecked")
-    public static <T> Class<T> getLambdaGenericType(SerializableLambda lambda, 
int genericParamIndex) {
+    public static <T> Class<T> getLambdaArgType(SerializableLambda lambda, int 
genericParamIndex) {
            String[] lambdaParams = getGenericTypeStrings(lambda);
            Class<?> clazz;
         try {

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=1726125&r1=1726124&r2=1726125&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
 Thu Jan 21 22:52:22 2016
@@ -8,7 +8,6 @@ import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
-import org.apache.felix.dm.builder.lambda.Cb;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponent;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentRef;
 import org.apache.felix.dm.builder.lambda.Functions.CbComponentRefService;
@@ -57,6 +56,12 @@ public abstract class ServiceCallbacksBu
     protected String m_swapped;
     protected final Class<S> m_serviceClass;
     
+    enum Cb {
+        ADD,        
+        CHG,        
+        REM
+    };
+    
        /**
         * List of service (add/change/remove) callbacks.
         */
@@ -155,116 +160,350 @@ public abstract class ServiceCallbacksBu
                return (B) this;
        }
 
-    public <T> B cb(Cb cbType, CbTypeService<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, service));
+    public <T> B cb(CbTypeService<T, S> add) {
+        return cb(add, null, null);
+    }
+    
+    public <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> remove) {
+        return cb(add, null, remove);
     }
     
-    public <T> B cb(Cb cbType, CbTypeServiceMap<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, service, new SRefAsMap(ref)));
+    public <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> change, 
CbTypeService<T, S> remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, srv));
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, srv));
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, srv));
+        return (B) this;
     }
 
-    public <T> B cb(Cb cbType, CbTypeServiceDict<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, service, new SRefAsDictionary(ref))); 
+    public B cbi(CbService<S> add) {
+        return cbi(add, null, null);
     }
     
-    public <T> B cb(Cb cbType, CbTypeRefService<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, ref, service)); 
+    public B cbi(CbService<S> add, CbService<S> remove) {
+        return cbi(add, null, remove);
     }
 
-    public <T> B cb(Cb cbType, CbTypeRef<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, ref)); 
+    public B cbi(CbService<S> add, CbService<S> change, CbService<S> remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(srv));
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(srv));
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(srv));
+        return (B) this;        
+    }
+    
+    public <T> B cb(CbTypeServiceMap<T, S> add) {
+        return cb(add, null, null);
+    }
+    
+    public <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> remove) 
{
+        return cb(add, null, remove);
     }
 
-    public <T> B cb(Cb cbType, CbTypeComponent<T> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, component)); 
+    public <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> change, 
CbTypeServiceMap<T, S> remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, srv, new SRefAsMap(ref)));
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, srv, new SRefAsMap(ref)));
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, srv, new SRefAsMap(ref)));
+        return (B) this;        
+    }
+    
+    public B cbi(CbServiceMap<S> add) {
+        return cbi(add, null, null);
+    }
+    
+    public B cbi(CbServiceMap<S> add, CbServiceMap<S> remove) {
+        return cbi(add, null, remove);
     }
 
-    public <T> B cb(Cb cbType, CbTypeComponentService<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, component, service)); 
+    public B cbi(CbServiceMap<S> add, CbServiceMap<S> change, CbServiceMap<S> 
remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(srv, new SRefAsMap(ref)));   
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(srv, new SRefAsMap(ref)));   
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(srv, new SRefAsMap(ref)));
+        return (B) this;        
     }
 
-    public <T> B cb(Cb cbType, CbTypeComponentRef<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, component, ref));  
+    public <T> B cb(CbTypeServiceDict<T, S> add) {
+        return cb(add, null, null);
     }
 
-    public <T> B cb(Cb cbType, CbTypeComponentRefService<T, S> callback) {
-        return setComponentCallbackRef(cbType, 
Helpers.getLambdaGenericType(callback, 0), 
-            (instance, component, ref, service) -> callback.accept((T) 
instance, component, ref, service));   
+    public <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> 
remove) {
+        return cb(add, null, remove);
+    }
+    
+    public <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> 
change, CbTypeServiceDict<T, S> remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, srv, new SRefAsDictionary(ref)));
+        if (change != null) 
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, srv, new 
SRefAsDictionary(ref)));
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, srv, new 
SRefAsDictionary(ref))); 
+        return (B) this;  
     }
 
-    public B cbi(Cb cbType, CbService<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(service));  
 
+    public B cbi(CbServiceDict<S> add) {
+        return cbi(add, null, null);
     }
     
-    public B cbi(Cb cbType, CbServiceMap<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(service, 
new SRefAsMap(ref)));   
+    public B cbi(CbServiceDict<S> add, CbServiceDict<S> remove) {
+        return cbi(add, null, remove);
     }
 
-    public B cbi(Cb cbType, CbServiceDict<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(service, 
new SRefAsDictionary(ref)));   
+    public B cbi(CbServiceDict<S> add, CbServiceDict<S> change, 
CbServiceDict<S> remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(srv, new SRefAsDictionary(ref)));   
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(srv, new SRefAsDictionary(ref)));   
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(srv, new SRefAsDictionary(ref)));
+        return (B) this;        
     }
 
-    public B cbi(Cb cbType, CbRef<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(ref));   
+    public <T> B cb(CbTypeRefService<T, S> add) {
+        return cb(add, null, null);
     }
 
-    public B cbi(Cb cbType, CbRefService<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(ref, 
service));   
+    public <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> remove) 
{
+        return cb(add, null, remove);
+    }
+
+    public <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> change, 
CbTypeRefService<T, S> remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, ref, srv)); 
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, ref, srv)); 
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, ref, srv)); 
+        return (B) this;
     }
 
-    public B cbi(Cb cbType, CbComponent callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> 
callback.accept(component));   
+    public B cbi(CbRefService<S> add) {
+        return cbi(add, null, null);
+    }
+
+    public B cbi(CbRefService<S> add, CbRefService<S> remove) {
+        return cbi(add, null, remove);
+    }
+
+    public B cbi(CbRefService<S> add, CbRefService<S> change, CbRefService<S> 
remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(ref, srv)); 
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(ref, srv)); 
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(ref, srv)); 
+        return (B) this;
+    }
+    
+    public <T> B cb(CbTypeRef<T, S> add) {
+        return cb(add, null, null);
+    }
+
+    public <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> remove) {
+        return cb(add, null, remove);
+    }
+
+    public <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> change, CbTypeRef<T, 
S> remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, ref));
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, ref)); 
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, ref)); 
+        return (B) this;
+    }
+
+    public B cbi(CbRef<S> add) {
+        return cbi(add, null, null);
+    }
+
+    public B cbi(CbRef<S> add, CbRef<S> remove) {
+        return cbi(add, null, remove);
+    }
+
+    public B cbi(CbRef<S> add, CbRef<S> change, CbRef<S> remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(ref)); 
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(ref)); 
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(ref)); 
+        return (B) this;
+    }
+
+    public <T> B cb(CbTypeComponent<T> add) {
+        return cb(add, null, null);
+    }
+
+    public <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> remove) {
+        return cb(add, null, remove);
+    }
+
+    public <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> change, 
CbTypeComponent<T> remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, comp));              
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, comp));              
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp)); 
+        return (B) this;
     }
 
-    public B cbi(Cb cbType, CbComponentService<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(component, 
service));   
+    public B cbi(CbComponent add) {
+        return cbi(add, null, null);
     }
 
-    public B cbi(Cb cbType, CbComponentRef<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(component, 
ref));           
+    public B cbi(CbComponent add, CbComponent remove) {
+        return cbi(add, null, remove);
     }
 
-    public B cbi(Cb cbType, CbComponentRefService<S> callback) {
-        return setInstanceCallbackRef(cbType, 
-            (instance, component, ref, service) -> callback.accept(component, 
ref, service));           
+    public B cbi(CbComponent add, CbComponent change, CbComponent remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(comp)); 
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(comp)); 
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(comp)); 
+        return (B) this;
+    }
+
+    public <T> B cb(CbTypeComponentRef<T, S>  add) {
+        return cb(add, null, null);
+    }
+
+    public <T> B cb(CbTypeComponentRef<T, S>  add, CbTypeComponentRef<T, S>  
remove) {
+        return cb(add, null, remove);
+    }
+
+    public <T> B cb(CbTypeComponentRef<T, S>  add, CbTypeComponentRef<T, S>  
change, CbTypeComponentRef<T, S>  remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, comp, ref));              
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, comp, ref)); 
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp, ref)); 
+        return (B) this;      
+    }
+
+    public B cbi(CbComponentRef<S> add) {
+        return cbi(add, null, null);
+    }
+
+    public B cbi(CbComponentRef<S> add, CbComponentRef<S> remove) {
+        return cbi(add, null, remove);
+    }
+
+    public B cbi(CbComponentRef<S> add, CbComponentRef<S> change, 
CbComponentRef<S> remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(comp, ref));
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(comp, ref));
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(comp, ref));
+        return (B) this;
+    }
+
+    public <T> B cb(CbTypeComponentService<T, S>  add) {
+        return cb(add, null, null);
+    }
+
+    public <T> B cb(CbTypeComponentService<T, S>  add, 
CbTypeComponentService<T, S>  remove) {
+        return cb(add, null, remove);
+    }
+
+    public <T> B cb(CbTypeComponentService<T, S>  add, 
CbTypeComponentService<T, S>  change, CbTypeComponentService<T, S>  remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, comp, srv)); 
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, comp, srv)); 
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp, srv)); 
+        return (B) this;
+    }
+
+    public B cbi(CbComponentService<S> add) {
+        return cbi(add, null, null);
+    }
+
+    public B cbi(CbComponentService<S> add, CbComponentService<S> remove) {
+        return cbi(add, null, remove);
+    }
+
+    public B cbi(CbComponentService<S> add, CbComponentService<S> change, 
CbComponentService<S> remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(comp, srv));
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(comp, srv));
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(comp, srv));
+        return (B) this;
+    }
+
+    public <T> B cb(CbTypeComponentRefService<T, S>  add) {
+        return cb(add, null, null);
+    }
+
+    public <T> B cb(CbTypeComponentRefService<T, S>  add, 
CbTypeComponentRefService<T, S>  remove) {
+        return cb(add, null, remove);
+    }
+
+    public <T> B cb(CbTypeComponentRefService<T, S>  add, 
CbTypeComponentRefService<T, S>  change, CbTypeComponentRefService<T, S>  
remove) {
+        if (add != null)
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), 
(inst, comp, ref, srv) -> add.accept((T) inst, comp, ref, srv)); 
+        if (change != null)
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 
0), (inst, comp, ref, srv) -> change.accept((T) inst, comp, ref, srv)); 
+        if (remove != null)
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 
0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp, ref, srv)); 
+        return (B) this;
+    }
+
+    public B cbi(CbComponentRefService<S> add) {
+        return cbi(add, null, null);
+    }
+
+    public B cbi(CbComponentRefService<S> add, CbComponentRefService<S> 
remove) {
+        return cbi(add, null, remove);
+    }
+
+    public B cbi(CbComponentRefService<S> add, CbComponentRefService<S> 
change, CbComponentRefService<S> remove) {
+        if (add != null)
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> 
add.accept(comp, ref, srv));
+        if (change != null)
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> 
change.accept(comp, ref, srv));
+        if (remove != null)
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> 
remove.accept(comp, ref, srv));
+        return (B) this;
     }
 
     public <T> B sw(CbTypeServiceService<T, S> swap) {
-        Class<T> type = Helpers.getLambdaGenericType(swap, 0);
+        Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, 
oserv, nref, nserv) ->
             swap.accept((T) inst, oserv, nserv));                              
     }
 
     public <T> B sw(CbTypeComponentServiceService<T, S> swap) {
-        Class<T> type = Helpers.getLambdaGenericType(swap, 0);
+        Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, 
oserv, nref, nserv) ->
             swap.accept((T) inst, component, oserv, nserv));                   
           
     }
 
     public <T> B sw(CbTypeRefServiceRefService<T, S> swap) {
-        Class<T> type = Helpers.getLambdaGenericType(swap, 0);
+        Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, 
oserv, nref, nserv) ->
             swap.accept((T) inst, oref, oserv, nref, nserv));                  
            
     }
     
     public <T> B sw(CbTypeComponentRefServiceRefService<T, S> swap) {
-        Class<T> type = Helpers.getLambdaGenericType(swap, 0);
+        Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, 
oserv, nref, nserv) ->
             swap.accept((T) inst, component, oref, oserv, nref, nserv));       
                       
     }
@@ -286,7 +525,6 @@ public abstract class ServiceCallbacksBu
     }
     
     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(cbType, l -> 
new ArrayList<>());
@@ -301,7 +539,6 @@ public abstract class ServiceCallbacksBu
     }
 
     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(cbType, l -> 
new ArrayList<>());


Reply via email to