/*
 *   Copyright 2006 The Apache Software Foundation
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
package org.apache.felix.scr;

/**
 * This factory allows other types of ComponentManagers to be provided.
 * 
 * 
 */
public class ManagerFactory {
	
	static ComponentManager createManager(GenericActivator activator, ComponentMetadata metadata) {
		GenericActivator.trace("ManagerFactory.createManager", metadata);
		return new ComponentManagerImpl(activator,metadata);
	}
}
