<!--
	Licensed to the Apache Software Foundation (ASF) under one
	or more contributor license agreements.  See the NOTICE file
	distributed with this work for additional information
	regarding copyright ownership.  The ASF licenses this file
	to you under the Apache License, Version 2.0 (the
	"License"); you may not use this file except in compliance
	with the License.  You may obtain a copy of the License at
	
	http://www.apache.org/licenses/LICENSE-2.0
	
	Unless required by applicable law or agreed to in writing,
	software distributed under the License is distributed on an
	"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
	KIND, either express or implied.  See the License for the
	specific language governing permissions and limitations
	under the License.
-->
<ipojo>
	<!-- Composite Handler -->
	<handler
		classname="org.apache.felix.ipojo.composite.instance.InstanceHandler"
		name="instance" type="composite" architecture="false" level="1">
		<requires filter="(factory.state=1)" field="m_factories"
			optional="true">
			<callback type="bind" method="bindFactory" />
			<callback type="unbind" method="unbindFactory" />
		</requires>
	</handler>
	<handler
		classname="org.apache.felix.ipojo.composite.service.instantiator.ServiceDependencyHandler"
		name="subservice" type="composite" architecture="false">
	</handler>
	<handler
		classname="org.apache.felix.ipojo.composite.service.provides.ProvidedServiceHandler"
		name="provides" type="composite" architecture="false" level="3">
	</handler>
	<handler
		classname="org.apache.felix.ipojo.composite.architecture.ArchitectureHandler"
		name="architecture" type="composite" architecture="false">
		<provides>
			<property field="m_name" name="instance.name" value="" />
		</provides>
	</handler>
</ipojo>