FELIX-3825 provide correct component manager as logger to Method management objects

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1424319 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java
index 981d258..3ee8ff6 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/ActivateMethod.java
@@ -35,14 +35,14 @@
         { COMPONENT_CONTEXT_CLASS };
 
 
-    public ActivateMethod( final SimpleLogger logger, final String methodName,
-        final boolean methodRequired, final Class componentClass, final boolean isDS11, final boolean isDS12Felix )
+    public ActivateMethod( final String methodName,
+            final boolean methodRequired, final Class componentClass, final boolean isDS11, final boolean isDS12Felix )
     {
-        super( logger, methodName, methodRequired, componentClass, isDS11, isDS12Felix );
+        super( methodName, methodRequired, componentClass, isDS11, isDS12Felix );
     }
 
 
-    protected Method doFindMethod( Class targetClass, boolean acceptPrivate, boolean acceptPackage )
+    protected Method doFindMethod( Class targetClass, boolean acceptPrivate, boolean acceptPackage, SimpleLogger logger )
         throws SuitableMethodNotAccessibleException, InvocationTargetException
     {
 
@@ -50,7 +50,7 @@
 
         try
         {
-            final Method method = getSingleParameterMethod( targetClass, acceptPrivate, acceptPackage );
+            final Method method = getSingleParameterMethod( targetClass, acceptPrivate, acceptPackage, logger );
             if ( method != null )
             {
                 return method;
@@ -86,7 +86,7 @@
                 try
                 {
                     // find the declared method in this class
-                    Method m = getMethod( targetClass, getMethodName(), null, acceptPrivate, acceptPackage );
+                    Method m = getMethod( targetClass, getMethodName(), null, acceptPrivate, acceptPackage, logger );
                     if ( m != null ) {
                         return m;
                     }
@@ -142,11 +142,11 @@
         return "activate";
     }
 
-    public MethodResult invoke(Object componentInstance, Object rawParameter, final MethodResult methodCallFailureResult)
+    public MethodResult invoke( Object componentInstance, Object rawParameter, final MethodResult methodCallFailureResult, SimpleLogger logger )
     {
-        if (methodExists())
+        if (methodExists( logger ))
         {
-            return super.invoke(componentInstance, rawParameter, methodCallFailureResult);
+            return super.invoke(componentInstance, rawParameter, methodCallFailureResult, logger );
         }
         return null;
     }
@@ -156,12 +156,14 @@
      * {@link #getAcceptedParameterTypes()} or <code>null</code> if no such
      * method exists.
      *
+     *
      * @param targetClass The class in which to look for the method. Only this
      *      class is searched for the method.
      * @param acceptPrivate <code>true</code> if private methods should be
      *      considered.
      * @param acceptPackage <code>true</code> if package private methods should
      *      be considered.
+     * @param logger
      * @return The requested method or <code>null</code> if no acceptable method
      *      can be found in the target class.
      * @throws SuitableMethodNotAccessibleException If a suitable method was
@@ -170,7 +172,7 @@
      *      trying to find the requested method.
      */
     private Method getSingleParameterMethod( final Class targetClass, final boolean acceptPrivate,
-        final boolean acceptPackage ) throws SuitableMethodNotAccessibleException, InvocationTargetException
+            final boolean acceptPackage, SimpleLogger logger ) throws SuitableMethodNotAccessibleException, InvocationTargetException
     {
         SuitableMethodNotAccessibleException ex = null;
         Method singleParameterMethod = null;
@@ -181,11 +183,11 @@
             {
                 // find the declared method in this class
                 singleParameterMethod = getMethod( targetClass, getMethodName(), new Class[]
-                    { acceptedTypes[i] }, acceptPrivate, acceptPackage );
+                    { acceptedTypes[i] }, acceptPrivate, acceptPackage, logger );
             }
             catch ( SuitableMethodNotAccessibleException thrown )
             {
-                getLogger().log( LogService.LOG_DEBUG, "SuitableMethodNotAccessible", thrown );
+                logger.log( LogService.LOG_DEBUG, "SuitableMethodNotAccessible", thrown );
                 ex = thrown;
             }
         }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
index eae9d20..747d50e 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
@@ -44,7 +44,6 @@
     protected static final Class MAP_CLASS = Map.class;
     protected static final Class INTEGER_CLASS = Integer.class;
 
-    private final SimpleLogger m_logger;
     private final boolean isDS11;
     private final boolean isDS12Felix;
 
@@ -57,17 +56,16 @@
 
     private volatile State m_state;
 
-    protected BaseMethod( final SimpleLogger logger, final String methodName,
+    protected BaseMethod( final String methodName,
             final Class componentClass, final boolean ds11, final boolean ds12Felix )
     {
-        this( logger, methodName, methodName != null, componentClass, ds11, ds12Felix );
+        this( methodName, methodName != null, componentClass, ds11, ds12Felix );
     }
 
 
-    protected BaseMethod( final SimpleLogger logger, final String methodName,
+    protected BaseMethod( final String methodName,
             final boolean methodRequired, final Class componentClass, final boolean ds11, final boolean ds12Felix )
     {
-        m_logger = logger;
         m_methodName = methodName;
         m_methodRequired = methodRequired;
         m_componentClass = componentClass;
@@ -83,13 +81,6 @@
         }
     }
 
-
-    protected final SimpleLogger getLogger()
-    {
-        return m_logger;
-    }
-
-
     protected final boolean isDS11()
     {
         return isDS11;
@@ -118,27 +109,27 @@
     }
 
 
-    synchronized void setMethod( Method method )
+    synchronized void setMethod( Method method, SimpleLogger logger )
     {
         this.m_method = method;
 
         if ( method != null )
         {
             m_state = Resolved.INSTANCE;
-            getLogger().log( LogService.LOG_DEBUG, "Found {0} method: {1}", new Object[]
+            logger.log( LogService.LOG_DEBUG, "Found {0} method: {1}", new Object[]
                 { getMethodNamePrefix(), method }, null );
         }
         else if ( m_methodRequired )
         {
             m_state = NotFound.INSTANCE;
-            getLogger().log(LogService.LOG_ERROR, "{0} method [{1}] not found; Component will fail",
+            logger.log(LogService.LOG_ERROR, "{0} method [{1}] not found; Component will fail",
                 new Object[]
                     { getMethodNamePrefix(), getMethodName() }, null);
         }
         else
         {
             // optional method not found, log as DEBUG and ignore
-            getLogger().log( LogService.LOG_DEBUG, "{0} method [{1}] not found, ignoring", new Object[]
+            logger.log( LogService.LOG_DEBUG, "{0} method [{1}] not found, ignoring", new Object[]
                 { getMethodNamePrefix(), getMethodName() }, null );
             m_state = NotApplicable.INSTANCE;
         }
@@ -161,8 +152,9 @@
      *      can be found in the target class or any super class.
      * @throws InvocationTargetException If an unexpected Throwable is caught
      *      trying to find the requested method.
+     * @param logger
      */
-    private Method findMethod() throws InvocationTargetException
+    private Method findMethod( SimpleLogger logger ) throws InvocationTargetException
     {
         boolean acceptPrivate = isDS11();
         boolean acceptPackage = isDS11();
@@ -174,15 +166,15 @@
         for ( Class theClass = targetClass; theClass != null; )
         {
 
-            if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+            if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
             {
-                getLogger().log( LogService.LOG_DEBUG,
+                logger.log( LogService.LOG_DEBUG,
                     "Locating method " + getMethodName() + " in class " + theClass.getName(), null );
             }
 
             try
             {
-                Method method = doFindMethod( theClass, acceptPrivate, acceptPackage );
+                Method method = doFindMethod( theClass, acceptPrivate, acceptPackage, logger );
                 if ( method != null )
                 {
                     return method;
@@ -191,7 +183,7 @@
             catch ( SuitableMethodNotAccessibleException ex )
             {
                 // log and return null
-                getLogger().log( LogService.LOG_ERROR,
+                logger.log( LogService.LOG_ERROR,
                     "findMethod: Suitable but non-accessible method {0} found in class {1}, subclass of {2}", new Object[]
                         { getMethodName(), theClass.getName(), targetClass.getName() }, null );
                 break;
@@ -220,13 +212,13 @@
 
 
     protected abstract Method doFindMethod( final Class targetClass, final boolean acceptPrivate,
-        final boolean acceptPackage ) throws SuitableMethodNotAccessibleException, InvocationTargetException;
+            final boolean acceptPackage, SimpleLogger logger ) throws SuitableMethodNotAccessibleException, InvocationTargetException;
 
 
-    private MethodResult invokeMethod( final Object componentInstance, final Object rawParameter )
+    private MethodResult invokeMethod( final Object componentInstance, final Object rawParameter, SimpleLogger logger )
         throws InvocationTargetException
     {
-        getLogger().log( LogService.LOG_DEBUG, "invoking {0}: {1}", new Object[]
+        logger.log( LogService.LOG_DEBUG, "invoking {0}: {1}", new Object[]
             { getMethodNamePrefix(), getMethodName() }, null );
         try
         {
@@ -234,20 +226,20 @@
             {
                 final Object[] params = getParameters(m_method, rawParameter);
                 Object result = m_method.invoke(componentInstance, params);
-                getLogger().log( LogService.LOG_DEBUG, "invoked {0}: {1}: parameters {2}", new Object[]
+                logger.log( LogService.LOG_DEBUG, "invoked {0}: {1}: parameters {2}", new Object[]
                     { getMethodNamePrefix(), getMethodName(), Arrays.asList( params ) }, null );
                 return new MethodResult((m_method.getReturnType() != Void.TYPE), (Map) result);
             }
             else
             {
-                getLogger().log( LogService.LOG_WARNING, "Method {0} cannot be called on null object",
+                logger.log( LogService.LOG_WARNING, "Method {0} cannot be called on null object",
                     new Object[]
                         { getMethodName() }, null );
             }
         }
         catch ( IllegalStateException ise )
         {
-            getLogger().log( LogService.LOG_DEBUG, ise.getMessage(), null );
+            logger.log( LogService.LOG_DEBUG, ise.getMessage(), null );
             return null;
         }
         catch ( IllegalAccessException ex )
@@ -255,7 +247,7 @@
             // 112.3.1 If the method is not is not declared protected or
             // public, SCR must log an error message with the log service,
             // if present, and ignore the method
-            getLogger().log( LogService.LOG_DEBUG, "Method {0} cannot be called", new Object[]
+            logger.log( LogService.LOG_DEBUG, "Method {0} cannot be called", new Object[]
                 { getMethodName() }, ex );
         }
         catch ( InvocationTargetException ex )
@@ -267,7 +259,7 @@
             throw new InvocationTargetException( t );
         }
 
-        // assume success (also if the mehotd is not available or accessible)
+        // assume success (also if the method is not available or accessible)
         return MethodResult.VOID; // TODO: or null ??
     }
 
@@ -304,11 +296,13 @@
      * the method is returned. Enforcing accessibility is required to support
      * invocation of protected methods.
      *
+     *
      * @param clazz The <code>Class</code> which provides the method.
      * @param name The name of the method.
      * @param parameterTypes The parameters to the method. Passing
      *      <code>null</code> is equivalent to using an empty array.
      *
+     * @param logger
      * @return The named method with enforced accessibility or <code>null</code>
      *      if no such method exists in the class.
      *
@@ -319,7 +313,7 @@
      *      trying to access the desired method.
      */
     public /* static */ Method getMethod( Class clazz, String name, Class[] parameterTypes, boolean acceptPrivate,
-        boolean acceptPackage ) throws SuitableMethodNotAccessibleException,
+            boolean acceptPackage, SimpleLogger logger ) throws SuitableMethodNotAccessibleException,
         InvocationTargetException
     {
         try
@@ -340,10 +334,10 @@
         {
             // thrown if no method is declared with the given name and
             // parameters
-            if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+            if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
             {
                 String argList = ( parameterTypes != null ) ? Arrays.asList( parameterTypes ).toString() : "";
-                getLogger().log( LogService.LOG_DEBUG, "Declared Method {0}.{1}({2}) not found", new Object[]
+                logger.log( LogService.LOG_DEBUG, "Declared Method {0}.{1}({2}) not found", new Object[]
                     { clazz.getName(), name, argList }, null );
             }
         }
@@ -352,7 +346,7 @@
             // may be thrown if a method would be found but the signature
             // contains throws declaration for an exception which cannot
             // be loaded
-            if ( getLogger().isLogEnabled( LogService.LOG_WARNING ) )
+            if ( logger.isLogEnabled( LogService.LOG_WARNING ) )
             {
                 StringBuffer buf = new StringBuffer();
                 buf.append( "Failure loooking up method " ).append( name ).append( '(' );
@@ -365,7 +359,7 @@
                     }
                 }
                 buf.append( ") in class class " ).append( clazz.getName() ).append( ". Assuming no such method." );
-                getLogger().log( LogService.LOG_WARNING, buf.toString(), cdfe );
+                logger.log( LogService.LOG_WARNING, buf.toString(), cdfe );
             }
         }
         catch ( SuitableMethodNotAccessibleException e)
@@ -386,7 +380,7 @@
 
     /**
      * Returns <code>true</code> if the method is acceptable to be returned from the
-     * {@link #getMethod(Class, String, Class[], boolean, boolean)} and also
+     * {@link #getMethod(Class, String, Class[], boolean, boolean, SimpleLogger)} and also
      * makes the method accessible.
      * <p>
      * This method returns <code>true</code> iff:
@@ -475,6 +469,7 @@
      *
      *
      *
+     *
      * @param componentInstance The component instance on which to call the
      *      method
      * @param rawParameter The parameter container providing the actual
@@ -482,6 +477,7 @@
      * @param methodCallFailureResult The result to return from this method if
      *      calling the method resulted in an exception.
      *
+     * @param logger
      * @return <code>true</code> if the method was called successfully or the
      *      method was not found and was not required. <code>false</code> if
      *      the method was not found but required.
@@ -489,15 +485,15 @@
      *      found and called, but the method threw an exception.
      */
     public MethodResult invoke( final Object componentInstance, final Object rawParameter,
-            final MethodResult methodCallFailureResult )
+            final MethodResult methodCallFailureResult, SimpleLogger logger )
     {
         try
         {
-            return m_state.invoke( this, componentInstance, rawParameter );
+            return m_state.invoke( this, componentInstance, rawParameter, logger );
         }
         catch ( InvocationTargetException ite )
         {
-            getLogger().log( LogService.LOG_ERROR, "The {0} method has thrown an exception", new Object[]
+            logger.log( LogService.LOG_ERROR, "The {0} method has thrown an exception", new Object[]
                 { getMethodName() }, ite.getCause() );
         }
 
@@ -505,19 +501,19 @@
     }
 
 
-    public boolean methodExists()
+    public boolean methodExists( SimpleLogger logger )
     {
-        return m_state.methodExists( this );
+        return m_state.methodExists( this, logger );
     }
 
     private static interface State
     {
 
-        MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter )
+        MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter, SimpleLogger logger )
             throws InvocationTargetException;
 
 
-        boolean methodExists( final BaseMethod baseMethod );
+        boolean methodExists( final BaseMethod baseMethod, SimpleLogger logger );
     }
 
     private static class NotApplicable implements State
@@ -526,13 +522,13 @@
         private static final State INSTANCE = new NotApplicable();
 
 
-        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter )
+        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter, SimpleLogger logger )
         {
             return MethodResult.VOID;
         }
 
 
-        public boolean methodExists( final BaseMethod baseMethod )
+        public boolean methodExists( final BaseMethod baseMethod, SimpleLogger logger )
         {
             return true;
         }
@@ -543,40 +539,40 @@
         private static final State INSTANCE = new NotResolved();
 
 
-        private void resolve( final BaseMethod baseMethod )
+        private void resolve( final BaseMethod baseMethod, SimpleLogger logger )
         {
-            baseMethod.getLogger().log( LogService.LOG_DEBUG, "getting {0}: {1}", new Object[]
+            logger.log( LogService.LOG_DEBUG, "getting {0}: {1}", new Object[]
                     {baseMethod.getMethodNamePrefix(), baseMethod.getMethodName()}, null );
 
             // resolve the method
             Method method;
             try
             {
-                method = baseMethod.findMethod();
+                method = baseMethod.findMethod( logger );
             }
             catch ( InvocationTargetException ex )
             {
                 method = null;
-                baseMethod.getLogger().log( LogService.LOG_WARNING, "{0} cannot be found", new Object[]
+                logger.log( LogService.LOG_WARNING, "{0} cannot be found", new Object[]
                         {baseMethod.getMethodName()}, ex.getTargetException() );
             }
 
-            baseMethod.setMethod( method );
+            baseMethod.setMethod( method, logger );
         }
 
 
-        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter )
+        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter, SimpleLogger logger )
             throws InvocationTargetException
         {
-            resolve( baseMethod );
-            return baseMethod.getState().invoke( baseMethod, componentInstance, rawParameter );
+            resolve( baseMethod, logger );
+            return baseMethod.getState().invoke( baseMethod, componentInstance, rawParameter, logger );
         }
 
 
-        public boolean methodExists( final BaseMethod baseMethod )
+        public boolean methodExists( final BaseMethod baseMethod, SimpleLogger logger )
         {
-            resolve( baseMethod );
-            return baseMethod.getState().methodExists( baseMethod );
+            resolve( baseMethod, logger );
+            return baseMethod.getState().methodExists( baseMethod, logger );
         }
     }
 
@@ -585,18 +581,18 @@
         private static final State INSTANCE = new NotFound();
 
 
-        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter )
+        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter, SimpleLogger logger )
         {
             // 112.3.1 If the method is not found , SCR must log an error
             // message with the log service, if present, and ignore the
             // method
-            baseMethod.getLogger().log( LogService.LOG_ERROR, "{0} method [{1}] not found", new Object[]
+            logger.log( LogService.LOG_ERROR, "{0} method [{1}] not found", new Object[]
                 { baseMethod.getMethodNamePrefix(), baseMethod.getMethodName() }, null );
             return null;
         }
 
 
-        public boolean methodExists( final BaseMethod baseMethod )
+        public boolean methodExists( final BaseMethod baseMethod, SimpleLogger logger )
         {
             return false;
         }
@@ -607,14 +603,14 @@
         private static final State INSTANCE = new Resolved();
 
 
-        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter )
+        public MethodResult invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter, SimpleLogger logger )
             throws InvocationTargetException
         {
-            return baseMethod.invokeMethod( componentInstance, rawParameter );
+            return baseMethod.invokeMethod( componentInstance, rawParameter, logger );
         }
 
 
-        public boolean methodExists( final BaseMethod baseMethod )
+        public boolean methodExists( final BaseMethod baseMethod, SimpleLogger logger )
         {
             return true;
         }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java
index 2c0f91b..b1f8438 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java
@@ -23,7 +23,6 @@
 import java.lang.reflect.Method;
 
 import org.apache.felix.scr.impl.Activator;
-import org.apache.felix.scr.impl.manager.AbstractComponentManager;
 import org.apache.felix.scr.impl.manager.RefPair;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -49,10 +48,10 @@
     private int m_paramStyle;
 
 
-    public BindMethod( final SimpleLogger logger, final String methodName,
+    public BindMethod( final String methodName,
             final Class componentClass, final String referenceClassName, final boolean isDS11, final boolean isDS12Felix )
     {
-        super( logger, methodName, componentClass, isDS11, isDS12Felix );
+        super( methodName, componentClass, isDS11, isDS12Felix );
         m_referenceClassName = referenceClassName;
     }
 
@@ -63,17 +62,19 @@
      * the class hierarchy is traversed until a method is found or the root
      * of the class hierarchy is reached without finding a method.
      *
+     *
      * @param targetClass The class in which to look for the method
      * @param acceptPrivate <code>true</code> if private methods should be
      *      considered.
      * @param acceptPackage <code>true</code> if package private methods should
      *      be considered.
+     * @param logger
      * @return The requested method or <code>null</code> if no acceptable method
      *      can be found in the target class or any super class.
      * @throws InvocationTargetException If an unexpected Throwable is caught
      *      trying to find the requested method.
      */
-    protected Method doFindMethod( Class targetClass, boolean acceptPrivate, boolean acceptPackage )
+    protected Method doFindMethod( Class targetClass, boolean acceptPrivate, boolean acceptPackage, SimpleLogger logger )
         throws SuitableMethodNotAccessibleException, InvocationTargetException
     {
         // 112.3.1 The method is searched for using the following priority
@@ -86,9 +87,9 @@
         // flag indicating a suitable but inaccessible method has been found
         boolean suitableMethodNotAccessible = false;
 
-        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
         {
-            getLogger().log( LogService.LOG_DEBUG,
+            logger.log( LogService.LOG_DEBUG,
                 "doFindMethod: Looking for method " + targetClass.getName() + "." + getMethodName(), null );
         }
 
@@ -96,12 +97,12 @@
         Method method;
         try
         {
-            method = getServiceReferenceMethod( targetClass, acceptPrivate, acceptPackage );
+            method = getServiceReferenceMethod( targetClass, acceptPrivate, acceptPackage, logger );
             if ( method != null )
             {
-                if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+                if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
                 {
-                    getLogger().log( LogService.LOG_DEBUG, "doFindMethod: Found Method " + method, null );
+                    logger.log( LogService.LOG_DEBUG, "doFindMethod: Found Method " + method, null );
                 }
                 m_paramStyle = SERVICE_REFERENCE;
                 return method;
@@ -113,13 +114,13 @@
         }
 
         // for further methods we need the class of the service object
-        final Class parameterClass = getParameterClass( targetClass );
+        final Class parameterClass = getParameterClass( targetClass, logger );
         if ( parameterClass != null )
         {
 
-            if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+            if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
             {
-                getLogger().log(
+                logger.log(
                     LogService.LOG_DEBUG,
                     "doFindMethod: No method taking ServiceReference found, checking method taking "
                         + parameterClass.getName(), null );
@@ -128,7 +129,7 @@
             // Case 2 - Service object parameter
             try
             {
-                method = getServiceObjectMethod( targetClass, parameterClass, acceptPrivate, acceptPackage );
+                method = getServiceObjectMethod( targetClass, parameterClass, acceptPrivate, acceptPackage, logger );
                 if ( method != null )
                 {
                     m_paramStyle = SERVICE_OBJECT;
@@ -143,7 +144,7 @@
             // Case 3 - Service interface assignement compatible methods
             try
             {
-                method = getServiceObjectAssignableMethod( targetClass, parameterClass, acceptPrivate, acceptPackage );
+                method = getServiceObjectAssignableMethod( targetClass, parameterClass, acceptPrivate, acceptPackage, logger );
                 if ( method != null )
                 {
                     m_paramStyle = SERVICE_OBJECT;
@@ -162,7 +163,7 @@
                 // Case 4 - same as case 2, but + Map param (DS 1.1 only)
                 try
                 {
-                    method = getServiceObjectWithMapMethod( targetClass, parameterClass, acceptPrivate, acceptPackage );
+                    method = getServiceObjectWithMapMethod( targetClass, parameterClass, acceptPrivate, acceptPackage, logger );
                     if ( method != null )
                     {
                         m_paramStyle = SERVICE_OBJECT_AND_MAP;
@@ -193,9 +194,9 @@
             }
 
         }
-        else if ( getLogger().isLogEnabled( LogService.LOG_WARNING ) )
+        else if ( logger.isLogEnabled( LogService.LOG_WARNING ) )
         {
-            getLogger().log(
+            logger.log(
                 LogService.LOG_WARNING,
                 "doFindMethod: Cannot check for methods taking parameter class " + m_referenceClassName + ": "
                     + targetClass.getName() + " does not see it", null );
@@ -205,7 +206,7 @@
         // the suitable methods are accessible, we have to terminate
         if ( suitableMethodNotAccessible )
         {
-            getLogger().log( LogService.LOG_ERROR,
+            logger.log( LogService.LOG_ERROR,
                 "doFindMethod: Suitable but non-accessible method found in class {0}", new Object[]
                     { targetClass.getName() }, null );
             throw new SuitableMethodNotAccessibleException();
@@ -229,14 +230,14 @@
      *      if the class loader of the <code>targetClass</code> cannot see that
      *      class.
      */
-    private Class getParameterClass( final Class targetClass )
+    private Class getParameterClass( final Class targetClass, SimpleLogger logger )
     {
-        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
         {
-            getLogger().log(
+            logger.log(
                 LogService.LOG_DEBUG,
-                "getParameterClass: Looking for interface class " + m_referenceClassName + "through loader of "
-                    + targetClass.getName(), null );
+                "getParameterClass: Looking for interface class {0} through loader of {1}",
+                    new Object[] {m_referenceClassName, targetClass.getName()}, null );
         }
 
         try
@@ -250,10 +251,10 @@
             }
 
             final Class referenceClass = loader.loadClass( m_referenceClassName );
-            if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+            if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
             {
-                getLogger().log( LogService.LOG_DEBUG,
-                    "getParameterClass: Found class " + referenceClass.getName(), null );
+                logger.log( LogService.LOG_DEBUG,
+                    "getParameterClass: Found class {0}", new Object[] {referenceClass.getName()}, null );
             }
             return referenceClass;
         }
@@ -263,9 +264,9 @@
             // super class so we try this class next
         }
 
-        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
         {
-            getLogger().log( LogService.LOG_DEBUG,
+            logger.log( LogService.LOG_DEBUG,
                 "getParameterClass: Not found through component class, using PackageAdmin service", null );
         }
 
@@ -282,19 +283,19 @@
                 {
                     try
                     {
-                        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+                        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
                         {
-                            getLogger().log(
+                            logger.log(
                                 LogService.LOG_DEBUG,
-                                "getParameterClass: Checking Bundle " + pkg[i].getExportingBundle().getSymbolicName()
-                                    + "/" + pkg[i].getExportingBundle().getBundleId(), null );
+                                "getParameterClass: Checking Bundle {0}/{1}",
+                                    new Object[] {pkg[i].getExportingBundle().getSymbolicName(), pkg[i].getExportingBundle().getBundleId()}, null );
                         }
 
                         Class referenceClass = pkg[i].getExportingBundle().loadClass( m_referenceClassName );
-                        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+                        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
                         {
-                            getLogger().log( LogService.LOG_DEBUG,
-                                "getParameterClass: Found class " + referenceClass.getName(), null );
+                            logger.log( LogService.LOG_DEBUG,
+                                    "getParameterClass: Found class {0}", new Object[] {referenceClass.getName()}, null );
                         }
                         return referenceClass;
                     }
@@ -304,23 +305,23 @@
                     }
                 }
             }
-            else if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+            else if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
             {
-                getLogger().log( LogService.LOG_DEBUG,
-                    "getParameterClass: No bundles exporting package " + referenceClassPackage + " found ", null );
+                logger.log( LogService.LOG_DEBUG,
+                    "getParameterClass: No bundles exporting package {0} found", new Object[] {referenceClassPackage}, null );
             }
         }
-        else if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+        else if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
         {
-            getLogger().log( LogService.LOG_DEBUG,
+            logger.log( LogService.LOG_DEBUG,
                 "getParameterClass: PackageAdmin service not available, cannot find class", null );
         }
 
         // class cannot be found, neither through the component nor from an
         // export, so we fall back to assuming Object
-        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
         {
-            getLogger().log( LogService.LOG_DEBUG,
+            logger.log( LogService.LOG_DEBUG,
                 "getParameterClass: No class found, falling back to class Object", null );
         }
         return OBJECT_CLASS;
@@ -331,30 +332,6 @@
      * Returns a method taking a single <code>ServiceReference</code> object
      * as a parameter or <code>null</code> if no such method exists.
      *
-     * @param targetClass The class in which to look for the method. Only this
-     *      class is searched for the method.
-     * @param acceptPrivate <code>true</code> if private methods should be
-     *      considered.
-     * @param acceptPackage <code>true</code> if package private methods should
-     *      be considered.
-     * @return The requested method or <code>null</code> if no acceptable method
-     *      can be found in the target class.
-     * @throws SuitableMethodNotAccessibleException If a suitable method was
-     *      found which is not accessible
-     * @throws InvocationTargetException If an unexpected Throwable is caught
-     *      trying to find the requested method.
-     */
-    private Method getServiceReferenceMethod( final Class targetClass, boolean acceptPrivate, boolean acceptPackage )
-        throws SuitableMethodNotAccessibleException, InvocationTargetException
-    {
-        return getMethod( targetClass, getMethodName(), new Class[]
-            { SERVICE_REFERENCE_CLASS }, acceptPrivate, acceptPackage );
-    }
-
-
-    /**
-     * Returns a method taking a single parameter of the exact type declared
-     * for the service reference or <code>null</code> if no such method exists.
      *
      * @param targetClass The class in which to look for the method. Only this
      *      class is searched for the method.
@@ -362,6 +339,34 @@
      *      considered.
      * @param acceptPackage <code>true</code> if package private methods should
      *      be considered.
+     * @param logger
+     * @return The requested method or <code>null</code> if no acceptable method
+     *      can be found in the target class.
+     * @throws SuitableMethodNotAccessibleException If a suitable method was
+     *      found which is not accessible
+     * @throws InvocationTargetException If an unexpected Throwable is caught
+     *      trying to find the requested method.
+     */
+    private Method getServiceReferenceMethod( final Class targetClass, boolean acceptPrivate, boolean acceptPackage, SimpleLogger logger )
+        throws SuitableMethodNotAccessibleException, InvocationTargetException
+    {
+        return getMethod( targetClass, getMethodName(), new Class[]
+            { SERVICE_REFERENCE_CLASS }, acceptPrivate, acceptPackage, logger );
+    }
+
+
+    /**
+     * Returns a method taking a single parameter of the exact type declared
+     * for the service reference or <code>null</code> if no such method exists.
+     *
+     *
+     * @param targetClass The class in which to look for the method. Only this
+     *      class is searched for the method.
+     * @param acceptPrivate <code>true</code> if private methods should be
+     *      considered.
+     * @param acceptPackage <code>true</code> if package private methods should
+     *      be considered.
+     * @param logger
      * @return The requested method or <code>null</code> if no acceptable method
      *      can be found in the target class.
      * @throws SuitableMethodNotAccessibleException If a suitable method was
@@ -370,10 +375,10 @@
      *      trying to find the requested method.
      */
     private Method getServiceObjectMethod( final Class targetClass, final Class parameterClass, boolean acceptPrivate,
-        boolean acceptPackage ) throws SuitableMethodNotAccessibleException, InvocationTargetException
+            boolean acceptPackage, SimpleLogger logger ) throws SuitableMethodNotAccessibleException, InvocationTargetException
     {
         return getMethod( targetClass, getMethodName(), new Class[]
-            { parameterClass }, acceptPrivate, acceptPackage );
+            { parameterClass }, acceptPrivate, acceptPackage, logger );
     }
 
 
@@ -382,27 +387,29 @@
      * compatible with the declared service type or <code>null</code> if no
      * such method exists.
      *
+     *
      * @param targetClass The class in which to look for the method. Only this
      *      class is searched for the method.
      * @param acceptPrivate <code>true</code> if private methods should be
      *      considered.
      * @param acceptPackage <code>true</code> if package private methods should
      *      be considered.
+     * @param logger
      * @return The requested method or <code>null</code> if no acceptable method
      *      can be found in the target class.
      * @throws SuitableMethodNotAccessibleException If a suitable method was
      *      found which is not accessible
      */
     private Method getServiceObjectAssignableMethod( final Class targetClass, final Class parameterClass,
-        boolean acceptPrivate, boolean acceptPackage ) throws SuitableMethodNotAccessibleException
+            boolean acceptPrivate, boolean acceptPackage, SimpleLogger logger ) throws SuitableMethodNotAccessibleException
     {
         // Get all potential bind methods
         Method candidateBindMethods[] = targetClass.getDeclaredMethods();
         boolean suitableNotAccessible = false;
 
-        if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+        if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
         {
-            getLogger().log(
+            logger.log(
                 LogService.LOG_DEBUG,
                 "getServiceObjectAssignableMethod: Checking " + candidateBindMethods.length
                     + " declared method in class " + targetClass.getName(), null );
@@ -412,9 +419,9 @@
         for ( int i = 0; i < candidateBindMethods.length; i++ )
         {
             Method method = candidateBindMethods[i];
-            if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+            if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
             {
-                getLogger().log( LogService.LOG_DEBUG, "getServiceObjectAssignableMethod: Checking " + method, null );
+                logger.log( LogService.LOG_DEBUG, "getServiceObjectAssignableMethod: Checking " + method, null );
             }
 
             // Get the parameters for the current method
@@ -426,9 +433,9 @@
             if ( parameters.length == 1 && method.getName().equals( getMethodName() ) )
             {
 
-                if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+                if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
                 {
-                    getLogger().log( LogService.LOG_DEBUG, "getServiceObjectAssignableMethod: Considering " + method, null );
+                    logger.log( LogService.LOG_DEBUG, "getServiceObjectAssignableMethod: Considering " + method, null );
                 }
 
                 // Get the parameter type
@@ -447,9 +454,9 @@
                     // suitable method is not accessible, flag for exception
                     suitableNotAccessible = true;
                 }
-                else if ( getLogger().isLogEnabled( LogService.LOG_DEBUG ) )
+                else if ( logger.isLogEnabled( LogService.LOG_DEBUG ) )
                 {
-                    getLogger().log(
+                    logger.log(
                         LogService.LOG_DEBUG,
                         "getServiceObjectAssignableMethod: Parameter failure: Required " + theParameter + "; actual "
                             + parameterClass.getName(), null );
@@ -475,12 +482,14 @@
      * type declared for the service reference and the second being a
      * <code>Map</code> or <code>null</code> if no such method exists.
      *
+     *
      * @param targetClass The class in which to look for the method. Only this
      *      class is searched for the method.
      * @param acceptPrivate <code>true</code> if private methods should be
      *      considered.
      * @param acceptPackage <code>true</code> if package private methods should
      *      be considered.
+     * @param logger
      * @return The requested method or <code>null</code> if no acceptable method
      *      can be found in the target class.
      * @throws SuitableMethodNotAccessibleException If a suitable method was
@@ -489,11 +498,11 @@
      *      trying to find the requested method.
      */
     private Method getServiceObjectWithMapMethod( final Class targetClass, final Class parameterClass,
-        boolean acceptPrivate, boolean acceptPackage ) throws SuitableMethodNotAccessibleException,
+            boolean acceptPrivate, boolean acceptPackage, SimpleLogger logger ) throws SuitableMethodNotAccessibleException,
         InvocationTargetException
     {
         return getMethod( targetClass, getMethodName(), new Class[]
-            { parameterClass, MAP_CLASS }, acceptPrivate, acceptPackage );
+            { parameterClass, MAP_CLASS }, acceptPrivate, acceptPackage, logger );
     }
 
 
@@ -554,19 +563,19 @@
         return null;
     }
 
-    public boolean getServiceObject( RefPair refPair, BundleContext context )
+    public boolean getServiceObject( RefPair refPair, BundleContext context, SimpleLogger logger )
     {
         //??? this resolves which we need.... better way?
-        if ( refPair.getServiceObject() == null && methodExists() )
+        if ( refPair.getServiceObject() == null && methodExists( logger ) )
         {
             if (m_paramStyle == SERVICE_OBJECT || m_paramStyle == SERVICE_OBJECT_AND_MAP) {
                 Object service = context.getService( refPair.getRef() );
                 if ( service == null )
                 {
                     refPair.setFailed();
-                    getLogger().log(
+                    logger.log(
                          LogService.LOG_WARNING,
-                         "Could not get service from ref " + refPair.getRef(), null );
+                         "Could not get service from ref {0}", new Object[] {refPair.getRef()}, null );
                     return false;
                 }
                 refPair.setServiceObject( service );
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethods.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethods.java
index 8f547c0..30531de 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethods.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethods.java
@@ -32,26 +32,24 @@
     private final UpdatedMethod m_updated;
     private final UnbindMethod m_unbind;
 
-    BindMethods( SimpleLogger logger, ReferenceMetadata m_dependencyMetadata, Class instanceClass,
+    BindMethods( ReferenceMetadata m_dependencyMetadata, Class instanceClass,
             final boolean isDS11, final boolean isDS12Felix )
     {
-        m_bind = new BindMethod( logger,
+        m_bind = new BindMethod(
                 m_dependencyMetadata.getBind(),
                 instanceClass,
                 m_dependencyMetadata.getInterface(),
                 isDS11, isDS12Felix
         );
-        m_updated = new UpdatedMethod( logger,
+        m_updated = new UpdatedMethod(
                 m_dependencyMetadata.getUpdated(),
                 instanceClass,
-                m_dependencyMetadata.getName(),
                 m_dependencyMetadata.getInterface(),
                 isDS11, isDS12Felix
         );
-        m_unbind = new UnbindMethod( logger,
+        m_unbind = new UnbindMethod(
                 m_dependencyMetadata.getUnbind(),
                 instanceClass,
-                m_dependencyMetadata.getName(),
                 m_dependencyMetadata.getInterface(),
                 isDS11, isDS12Felix
         );
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java
index 3759b7f..8d94814 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java
@@ -39,7 +39,7 @@
 
     private final Map bindMethodMap = new HashMap();//<String, BindMethods>
 
-    public synchronized void initComponentMethods(SimpleLogger logger, ComponentMetadata componentMetadata, Class implementationObjectClass)
+    public synchronized void initComponentMethods( ComponentMetadata componentMetadata, Class implementationObjectClass )
     {
         if (m_activateMethod != null)
         {
@@ -47,18 +47,18 @@
         }
         boolean isDS11 = componentMetadata.isDS11();
         boolean isDS12Felix = componentMetadata.isDS12Felix();
-        m_activateMethod = new ActivateMethod( logger, componentMetadata.getActivate(), componentMetadata
+        m_activateMethod = new ActivateMethod( componentMetadata.getActivate(), componentMetadata
                 .isActivateDeclared(), implementationObjectClass, isDS11, isDS12Felix );
-        m_deactivateMethod = new DeactivateMethod( logger, componentMetadata.getDeactivate(),
+        m_deactivateMethod = new DeactivateMethod( componentMetadata.getDeactivate(),
                 componentMetadata.isDeactivateDeclared(), implementationObjectClass, isDS11, isDS12Felix );
 
-        m_modifiedMethod = new ModifiedMethod( logger, componentMetadata.getModified(), implementationObjectClass, isDS11, isDS12Felix );
+        m_modifiedMethod = new ModifiedMethod( componentMetadata.getModified(), implementationObjectClass, isDS11, isDS12Felix );
 
         for ( Iterator it = componentMetadata.getDependencies().iterator(); it.hasNext(); )
         {
             ReferenceMetadata referenceMetadata = ( ReferenceMetadata ) it.next();
             String refName = referenceMetadata.getName();
-            BindMethods bindMethods = new BindMethods(logger, referenceMetadata, implementationObjectClass, isDS11, isDS12Felix);
+            BindMethods bindMethods = new BindMethods( referenceMetadata, implementationObjectClass, isDS11, isDS12Felix);
             bindMethodMap.put( refName, bindMethods );
         }
     }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java
index 152aa2f..a74c4df 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/DeactivateMethod.java
@@ -19,9 +19,6 @@
 package org.apache.felix.scr.impl.helper;
 
 
-import org.apache.felix.scr.impl.manager.AbstractComponentManager;
-
-
 public class DeactivateMethod extends ActivateMethod
 {
 
@@ -29,10 +26,10 @@
         { COMPONENT_CONTEXT_CLASS, BUNDLE_CONTEXT_CLASS, MAP_CLASS, Integer.TYPE, INTEGER_CLASS };
 
 
-    public DeactivateMethod( final SimpleLogger logger, final String methodName,
-        final boolean methodRequired, final Class componentClass, final boolean isDS11, final boolean isDS12Felix )
+    public DeactivateMethod( final String methodName,
+            final boolean methodRequired, final Class componentClass, final boolean isDS11, final boolean isDS12Felix )
     {
-        super( logger, methodName, methodRequired, componentClass, isDS11, isDS12Felix );
+        super( methodName, methodRequired, componentClass, isDS11, isDS12Felix );
     }
 
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java
index c660e56c..68966c4 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/ModifiedMethod.java
@@ -19,16 +19,13 @@
 package org.apache.felix.scr.impl.helper;
 
 
-import org.apache.felix.scr.impl.manager.AbstractComponentManager;
-
-
 public class ModifiedMethod extends ActivateMethod
 {
 
-    public ModifiedMethod( final SimpleLogger logger, final String methodName,
-        final Class componentClass, final boolean isDS11, final boolean isDS12Felix )
+    public ModifiedMethod( final String methodName,
+            final Class componentClass, final boolean isDS11, final boolean isDS12Felix )
     {
-        super( logger, methodName, methodName != null, componentClass, isDS11, isDS12Felix );
+        super( methodName, methodName != null, componentClass, isDS11, isDS12Felix );
     }
 
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java
index 3b9d677..c5d4cff 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/UnbindMethod.java
@@ -19,19 +19,16 @@
 package org.apache.felix.scr.impl.helper;
 
 
-import org.apache.felix.scr.impl.manager.AbstractComponentManager;
-
-
 /**
  * Component method to be invoked on service unbinding.
  */
 public class UnbindMethod extends BindMethod
 {
 
-    public UnbindMethod( final SimpleLogger logger, final String methodName,
-        final Class componentClass, final String referenceName, final String referenceClassName, final boolean isDS11, final boolean isDS12Felix )
+    public UnbindMethod( final String methodName,
+            final Class componentClass, final String referenceClassName, final boolean isDS11, final boolean isDS12Felix )
     {
-        super( logger, methodName, componentClass, referenceClassName, isDS11, isDS12Felix );
+        super( methodName, componentClass, referenceClassName, isDS11, isDS12Felix );
     }
 
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/UpdatedMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/UpdatedMethod.java
index 8d3fe91..80f24b6 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/UpdatedMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/UpdatedMethod.java
@@ -19,19 +19,16 @@
 package org.apache.felix.scr.impl.helper;
 
 
-import org.apache.felix.scr.impl.manager.AbstractComponentManager;
-
-
 /**
  * Component method to be invoked on service property update of a bound service.
  */
 public class UpdatedMethod extends BindMethod
 {
 
-    public UpdatedMethod( final SimpleLogger logger, final String methodName,
-        final Class componentClass, final String referenceName, final String referenceClassName, final boolean isDS11, final boolean isDS12Felix )
+    public UpdatedMethod( final String methodName,
+            final Class componentClass, final String referenceClassName, final boolean isDS11, final boolean isDS12Felix )
     {
-        super( logger, methodName, componentClass, referenceClassName, isDS11, isDS12Felix );
+        super( methodName, componentClass, referenceClassName, isDS11, isDS12Felix );
     }
 
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index 07ad20f..fd48364 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -784,7 +784,7 @@
             log( LogService.LOG_ERROR, "Could not load implementation object class", e );
             return false;
         }
-        m_componentMethods.initComponentMethods( this, m_componentMetadata, implementationObjectClass );
+        m_componentMethods.initComponentMethods( m_componentMetadata, implementationObjectClass );
 
         for ( DependencyManager dependencyManager : m_dependencyManagers )
         {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index 3613d8a..6bf977c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -309,7 +309,7 @@
             }
             if (isActive())
             {
-                 m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext());
+                 m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
             }
             return refPair;
         }
@@ -387,7 +387,7 @@
             {
                 synchronized (refPair)
                 {
-                    if (m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext()))
+                    if (m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager ))
                     {
                          success = true;
                     }
@@ -433,7 +433,7 @@
             RefPair<T> refPair = new RefPair<T>( serviceReference  );
             if (isActive())
             {
-                 m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext());
+                 m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
             }
             return refPair;
         }
@@ -497,7 +497,7 @@
             {
                 synchronized (refPair)
                 {
-                    success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext());
+                    success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
                 }
             }
             return success;
@@ -584,7 +584,7 @@
             {
                 synchronized (refPair)
                 {
-                    success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext());
+                    success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
                 }
                 refs.add(refPair) ;
             }
@@ -636,7 +636,7 @@
                     {
                         synchronized ( refPair )
                         {
-                            m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext() );
+                            m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
                         }
                         if ( !refPair.isFailed() )
                         {
@@ -691,7 +691,7 @@
                         nextRefPair = tracked.values().iterator().next();
                         synchronized ( nextRefPair )
                         {
-                            if (!m_bindMethods.getBind().getServiceObject( nextRefPair, m_componentManager.getActivator().getBundleContext() ))
+                            if (!m_bindMethods.getBind().getServiceObject( nextRefPair, m_componentManager.getActivator().getBundleContext(), m_componentManager ))
                             {
                                 //TODO error???
                             }
@@ -745,7 +745,7 @@
                     RefPair<T> refPair = tracked.values().iterator().next();
                     synchronized ( refPair )
                     {
-                        success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext() );
+                        success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
                     }
                     if (refPair.isFailed())
                     {
@@ -861,7 +861,7 @@
                     RefPair<T> refPair = tracked.values().iterator().next();
                     synchronized ( refPair )
                     {
-                        success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext() );
+                        success |= m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
                     }
                     this.refPair = refPair;
                 }
@@ -1416,7 +1416,7 @@
                 //something else got the reference and may be binding it.
                 return;
             }
-            m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext() );
+            m_bindMethods.getBind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager );
         }
         m_componentManager.invokeBindMethod( this, refPair, trackingCount );
     }
@@ -1456,7 +1456,7 @@
                     return true;
                 }
             }
-            MethodResult result = m_bindMethods.getBind().invoke( componentInstance, refPair, MethodResult.VOID );
+            MethodResult result = m_bindMethods.getBind().invoke( componentInstance, refPair, MethodResult.VOID, m_componentManager );
             if ( result == null )
             {
                 return false;
@@ -1515,7 +1515,7 @@
                     return;
                 }
             }
-            if ( !m_bindMethods.getUpdated().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext() ))
+            if ( !m_bindMethods.getUpdated().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager ))
             {
                 m_componentManager.log( LogService.LOG_WARNING,
                         "DependencyManager : invokeUpdatedMethod : Service not available from service registry for ServiceReference {0} for reference {1}",
@@ -1523,7 +1523,7 @@
                 return;
 
             }
-            MethodResult methodResult = m_bindMethods.getUpdated().invoke( componentInstance, refPair, MethodResult.VOID );
+            MethodResult methodResult = m_bindMethods.getUpdated().invoke( componentInstance, refPair, MethodResult.VOID, m_componentManager );
             if ( methodResult != null)
             {
                 m_componentManager.setServiceProperties( methodResult );
@@ -1587,7 +1587,7 @@
                         "DependencyManager : invokeUnbindMethod : Component set, but reference not present", null );
                 return;
             }
-            if ( !m_bindMethods.getUnbind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext() ))
+            if ( !m_bindMethods.getUnbind().getServiceObject( refPair, m_componentManager.getActivator().getBundleContext(), m_componentManager ))
             {
                 m_componentManager.log( LogService.LOG_WARNING,
                         "DependencyManager : invokeUnbindMethod : Service not available from service registry for ServiceReference {0} for reference {1}",
@@ -1595,7 +1595,7 @@
                 return;
 
             }
-            MethodResult methodResult = m_bindMethods.getUnbind().invoke( componentInstance, refPair, MethodResult.VOID );
+            MethodResult methodResult = m_bindMethods.getUnbind().invoke( componentInstance, refPair, MethodResult.VOID, m_componentManager );
             if ( methodResult != null )
             {
                 m_componentManager.setServiceProperties( methodResult );
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index cbb67e3..f29fb00 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -287,7 +287,7 @@
 
         // 5. Call the activate method, if present
         final MethodResult result = getComponentMethods().getActivateMethod().invoke( implementationObject, new ActivatorParameter(
-                componentContext, 1 ), null );
+                componentContext, 1 ), null, this );
         if ( result == null )
         {
             // make sure the implementation object is not available
@@ -321,7 +321,7 @@
         // method throws an exception, SCR must log an error message containing the
         // exception with the Log Service and continue) has already been logged
         final MethodResult result = getComponentMethods().getDeactivateMethod().invoke( implementationObject, new ActivatorParameter( componentContext,
-                reason ), null );
+                reason ), null, this );
         if ( result != null )
         {
             setServiceProperties( result );
@@ -649,7 +649,7 @@
     protected MethodResult invokeModifiedMethod()
     {
         return getComponentMethods().getModifiedMethod().invoke( getInstance(),
-                    new ActivatorParameter( m_componentContext, -1 ), MethodResult.VOID );
+                    new ActivatorParameter( m_componentContext, -1 ), MethodResult.VOID, this );
     }
 
     protected boolean hasInstance()
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
index e4e609c..e97e010 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
@@ -249,14 +249,14 @@
         {
             Object instance = componentContext.getInstance();
             result = modifiedMethod.invoke( instance,
-                    new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID );
+                    new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID, this );
 
         }
         for ( BundleComponentContext componentContext : tmpImplementationObjects.values() )
         {
             Object instance = componentContext.getInstance();
             result = modifiedMethod.invoke( instance,
-                    new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID );
+                    new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID, this );
 
         }
         return result;
diff --git a/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java b/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java
index 973e5c7..2833eaf 100644
--- a/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/impl/helper/ActivateMethodTest.java
@@ -271,8 +271,8 @@
             }
         };
         ImmediateComponentManager icm = new ImmediateComponentManager( null, null, metadata, new ComponentMethods() );
-        ActivateMethod am = new ActivateMethod( icm, methodName, methodName != null, obj.getClass(), true, false );
-        am.invoke( obj, new ActivateMethod.ActivatorParameter( m_ctx, -1 ), null );
+        ActivateMethod am = new ActivateMethod( methodName, methodName != null, obj.getClass(), true, false );
+        am.invoke( obj, new ActivateMethod.ActivatorParameter( m_ctx, -1 ), null, icm );
         Method m = get(am, "m_method");
         assertNotNull( m );
         assertEquals( methodName, m.getName() );
@@ -299,8 +299,8 @@
             }
         };
         ImmediateComponentManager icm = new ImmediateComponentManager( null, null, metadata, new ComponentMethods() );
-        ActivateMethod am = new ActivateMethod( icm, methodName, methodName != null, obj.getClass(), true, false );
-        am.invoke( obj, new ActivateMethod.ActivatorParameter( m_ctx, -1 ), null );
+        ActivateMethod am = new ActivateMethod( methodName, methodName != null, obj.getClass(), true, false );
+        am.invoke( obj, new ActivateMethod.ActivatorParameter( m_ctx, -1 ), null, icm );
         assertNull( get( am, "m_method" ) );
         assertNull( obj.getCalledMethod() );
     }
diff --git a/scr/src/test/java/org/apache/felix/scr/impl/helper/BindMethodTest.java b/scr/src/test/java/org/apache/felix/scr/impl/helper/BindMethodTest.java
index e184790..f3989bb 100644
--- a/scr/src/test/java/org/apache/felix/scr/impl/helper/BindMethodTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/impl/helper/BindMethodTest.java
@@ -21,7 +21,6 @@
 
 import junit.framework.TestCase;
 
-import org.apache.felix.scr.impl.manager.AbstractComponentManager;
 import org.apache.felix.scr.impl.manager.ImmediateComponentManager;
 import org.apache.felix.scr.impl.manager.RefPair;
 import org.apache.felix.scr.impl.manager.components.FakeService;
@@ -434,11 +433,11 @@
             }
         };
         ImmediateComponentManager icm = new ImmediateComponentManager( null, null, metadata, new ComponentMethods() );
-        BindMethod bm = new BindMethod( icm, methodName, component.getClass(),
+        BindMethod bm = new BindMethod( methodName, component.getClass(),
                 FakeService.class.getName(), isDS11, false );
         RefPair refPair = new RefPair( m_serviceReference );
-        assertTrue( bm.getServiceObject( refPair, m_context ) );
-        bm.invoke( component, refPair, null );
+        assertTrue( bm.getServiceObject( refPair, m_context, icm ) );
+        bm.invoke( component, refPair, null, icm );
         assertEquals( expectCallPerformed, component.callPerformed );
     }
 }