You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/07/30 21:48:14 UTC

[15/80] [partial] zest-java git commit: First round of changes to move to org.apache.zest namespace.

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/LayerAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/LayerAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/LayerAssemblyImpl.java
new file mode 100644
index 0000000..c199bee
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/LayerAssemblyImpl.java
@@ -0,0 +1,625 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ * Copyright (c) 2012, Paul Merlin.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.zest.api.activation.Activator;
+import org.apache.zest.api.common.MetaInfo;
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.api.service.ServiceImporter;
+import org.apache.zest.api.structure.Layer;
+import org.apache.zest.bootstrap.ApplicationAssembly;
+import org.apache.zest.bootstrap.AssemblyVisitor;
+import org.apache.zest.bootstrap.EntityAssembly;
+import org.apache.zest.bootstrap.EntityDeclaration;
+import org.apache.zest.bootstrap.ImportedServiceAssembly;
+import org.apache.zest.bootstrap.ImportedServiceDeclaration;
+import org.apache.zest.bootstrap.LayerAssembly;
+import org.apache.zest.bootstrap.ModuleAssembly;
+import org.apache.zest.bootstrap.ObjectAssembly;
+import org.apache.zest.bootstrap.ObjectDeclaration;
+import org.apache.zest.bootstrap.ServiceAssembly;
+import org.apache.zest.bootstrap.ServiceDeclaration;
+import org.apache.zest.bootstrap.TransientAssembly;
+import org.apache.zest.bootstrap.TransientDeclaration;
+import org.apache.zest.bootstrap.ValueAssembly;
+import org.apache.zest.bootstrap.ValueDeclaration;
+import org.apache.zest.functional.Specification;
+
+/**
+ * Assembly of a Layer. From here you can create more ModuleAssemblies for
+ * the Layer that is being assembled. It is also here that you define
+ * what other Layers this Layer is using by calling {@link org.apache.zest.runtime.bootstrap.LayerAssemblyImpl#uses()}.
+ */
+public final class LayerAssemblyImpl
+    implements LayerAssembly
+{
+    private final ApplicationAssembly applicationAssembly;
+    private final HashMap<String, ModuleAssemblyImpl> moduleAssemblies;
+    private final Set<LayerAssembly> uses;
+
+    private String name;
+    private final MetaInfo metaInfo = new MetaInfo();
+    private final List<Class<? extends Activator<Layer>>> activators = new ArrayList<>();
+
+    public LayerAssemblyImpl( ApplicationAssembly applicationAssembly, String name )
+    {
+        this.applicationAssembly = applicationAssembly;
+        this.name = name;
+
+        moduleAssemblies = new LinkedHashMap<>();
+        uses = new LinkedHashSet<>();
+    }
+
+    @Override
+    public ModuleAssembly module( String name )
+    {
+        if( name != null )
+        {
+            ModuleAssemblyImpl existing = moduleAssemblies.get( name );
+            if( existing != null )
+            {
+                return existing;
+            }
+        }
+        ModuleAssemblyImpl moduleAssembly = new ModuleAssemblyImpl( this, name );
+        moduleAssemblies.put( name, moduleAssembly );
+        return moduleAssembly;
+    }
+
+    @Override
+    public ApplicationAssembly application()
+    {
+        return applicationAssembly;
+    }
+
+    @Override
+    public LayerAssembly setName( String name )
+    {
+        this.name = name;
+        return this;
+    }
+
+    @Override
+    public LayerAssembly setMetaInfo( Object info )
+    {
+        metaInfo.set( info );
+        return this;
+    }
+
+    @Override
+    public LayerAssembly uses( LayerAssembly... layerAssembly )
+        throws IllegalArgumentException
+    {
+        uses.addAll( Arrays.asList( layerAssembly ) );
+        return this;
+    }
+
+    @Override
+    @SafeVarargs
+    public final LayerAssembly withActivators( Class<? extends Activator<Layer>>... activators )
+    {
+        this.activators.addAll( Arrays.asList( activators ) );
+        return this;
+    }
+
+    @Override
+    public <ThrowableType extends Throwable> void visit( AssemblyVisitor<ThrowableType> visitor )
+        throws ThrowableType
+    {
+        visitor.visitLayer( this );
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            moduleAssembly.visit( visitor );
+        }
+    }
+
+    @Override
+    public EntityDeclaration entities( Specification<? super EntityAssembly> specification )
+    {
+        final List<EntityDeclaration> declarations = new ArrayList<>();
+
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            declarations.add( moduleAssembly.entities( specification ) );
+        }
+
+        return new EntityDeclaration()
+        {
+            @Override
+            public EntityDeclaration setMetaInfo( Object info )
+            {
+                for( EntityDeclaration declaration : declarations )
+                {
+                    declaration.setMetaInfo( info );
+                }
+                return this;
+            }
+
+            @Override
+            public EntityDeclaration visibleIn( Visibility visibility )
+            {
+                for( EntityDeclaration declaration : declarations )
+                {
+                    declaration.visibleIn( visibility );
+                }
+                return this;
+            }
+
+            @Override
+            public EntityDeclaration withConcerns( Class<?>... concerns )
+            {
+                for( EntityDeclaration declaration : declarations )
+                {
+                    declaration.withConcerns( concerns );
+                }
+                return this;
+            }
+
+            @Override
+            public EntityDeclaration withSideEffects( Class<?>... sideEffects )
+            {
+                for( EntityDeclaration declaration : declarations )
+                {
+                    declaration.withSideEffects( sideEffects );
+                }
+                return this;
+            }
+
+            @Override
+            public EntityDeclaration withMixins( Class<?>... mixins )
+            {
+                for( EntityDeclaration declaration : declarations )
+                {
+                    declaration.withMixins( mixins );
+                }
+                return this;
+            }
+
+            @Override
+            public EntityDeclaration withTypes( Class<?>... types )
+            {
+                for( EntityDeclaration declaration : declarations )
+                {
+                    declaration.withTypes( types );
+                }
+                return this;
+            }
+        };
+    }
+
+    @Override
+    public ServiceDeclaration services( Specification<? super ServiceAssembly> specification )
+    {
+        final List<ServiceDeclaration> declarations = new ArrayList<>();
+
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            declarations.add( moduleAssembly.services( specification ) );
+        }
+
+        return new ServiceDeclaration()
+        {
+            @Override
+            public ServiceDeclaration setMetaInfo( Object serviceAttribute )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.setMetaInfo( serviceAttribute );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration visibleIn( Visibility visibility )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.visibleIn( visibility );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration withConcerns( Class<?>... concerns )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.withConcerns( concerns );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration withSideEffects( Class<?>... sideEffects )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.withSideEffects( sideEffects );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration withMixins( Class<?>... mixins )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.withMixins( mixins );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration withTypes( Class<?>... types )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.withTypes( types );
+                }
+                return this;
+            }
+
+            @Override
+            @SafeVarargs
+            public final ServiceDeclaration withActivators( Class<? extends Activator<?>>... activators )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.withActivators( activators );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration identifiedBy( String identity )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.identifiedBy( identity );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration taggedWith( String... tags )
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.taggedWith( tags );
+                }
+                return this;
+            }
+
+            @Override
+            public ServiceDeclaration instantiateOnStartup()
+            {
+                for( ServiceDeclaration declaration : declarations )
+                {
+                    declaration.instantiateOnStartup();
+                }
+
+                return this;
+            }
+        };
+    }
+
+    @Override
+    public TransientDeclaration transients( Specification<? super TransientAssembly> specification )
+    {
+        final List<TransientDeclaration> declarations = new ArrayList<>();
+
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            declarations.add( moduleAssembly.transients( specification ) );
+        }
+
+        return new TransientDeclaration()
+        {
+            @Override
+            public TransientDeclaration setMetaInfo( Object info )
+            {
+                for( TransientDeclaration declaration : declarations )
+                {
+                    declaration.setMetaInfo( info );
+                }
+                return this;
+            }
+
+            @Override
+            public TransientDeclaration visibleIn( Visibility visibility )
+            {
+                for( TransientDeclaration declaration : declarations )
+                {
+                    declaration.visibleIn( visibility );
+                }
+                return this;
+            }
+
+            @Override
+            public TransientDeclaration withConcerns( Class<?>... concerns )
+            {
+                for( TransientDeclaration declaration : declarations )
+                {
+                    declaration.withConcerns( concerns );
+                }
+                return this;
+            }
+
+            @Override
+            public TransientDeclaration withSideEffects( Class<?>... sideEffects )
+            {
+                for( TransientDeclaration declaration : declarations )
+                {
+                    declaration.withSideEffects( sideEffects );
+                }
+                return this;
+            }
+
+            @Override
+            public TransientDeclaration withMixins( Class<?>... mixins )
+            {
+                for( TransientDeclaration declaration : declarations )
+                {
+                    declaration.withMixins( mixins );
+                }
+                return this;
+            }
+
+            @Override
+            public TransientDeclaration withTypes( Class<?>... types )
+            {
+                for( TransientDeclaration declaration : declarations )
+                {
+                    declaration.withTypes( types );
+                }
+                return this;
+            }
+        };
+    }
+
+    @Override
+    public ValueDeclaration values( Specification<? super ValueAssembly> specification )
+    {
+        final List<ValueDeclaration> declarations = new ArrayList<>();
+
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            declarations.add( moduleAssembly.values( specification ) );
+        }
+        return new ValueDeclaration()
+        {
+            @Override
+            public ValueDeclaration setMetaInfo( Object info )
+            {
+                for( ValueDeclaration declaration : declarations )
+                {
+                    declaration.setMetaInfo( info );
+                }
+                return this;
+            }
+
+            @Override
+            public ValueDeclaration visibleIn( Visibility visibility )
+            {
+                for( ValueDeclaration declaration : declarations )
+                {
+                    declaration.visibleIn( visibility );
+                }
+                return this;
+            }
+
+            @Override
+            public ValueDeclaration withConcerns( Class<?>... concerns )
+            {
+                for( ValueDeclaration declaration : declarations )
+                {
+                    declaration.withConcerns( concerns );
+                }
+                return this;
+            }
+
+            @Override
+            public ValueDeclaration withSideEffects( Class<?>... sideEffects )
+            {
+                for( ValueDeclaration declaration : declarations )
+                {
+                    declaration.withSideEffects( sideEffects );
+                }
+                return this;
+            }
+
+            @Override
+            public ValueDeclaration withMixins( Class<?>... mixins )
+            {
+                for( ValueDeclaration declaration : declarations )
+                {
+                    declaration.withMixins( mixins );
+                }
+                return this;
+            }
+
+            @Override
+            public ValueDeclaration withTypes( Class<?>... types )
+            {
+                for( ValueDeclaration declaration : declarations )
+                {
+                    declaration.withTypes( types );
+                }
+                return this;
+            }
+        };
+    }
+
+    @Override
+    public ObjectDeclaration objects( Specification<? super ObjectAssembly> specification )
+    {
+        final List<ObjectDeclaration> declarations = new ArrayList<>();
+
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            declarations.add( moduleAssembly.objects( specification ) );
+        }
+        return new ObjectDeclaration()
+        {
+            @Override
+            public ObjectDeclaration setMetaInfo( Object info )
+            {
+                for( ObjectDeclaration declaration : declarations )
+                {
+                    declaration.setMetaInfo( info );
+                }
+                return this;
+            }
+
+            @Override
+            public ObjectDeclaration visibleIn( Visibility visibility )
+                throws IllegalStateException
+            {
+                for( ObjectDeclaration declaration : declarations )
+                {
+                    declaration.visibleIn( visibility );
+                }
+                return this;
+            }
+        };
+    }
+
+    @Override
+    public ImportedServiceDeclaration importedServices( Specification<? super ImportedServiceAssembly> specification )
+    {
+        final List<ImportedServiceDeclaration> declarations = new ArrayList<>();
+
+        for( ModuleAssemblyImpl moduleAssembly : moduleAssemblies.values() )
+        {
+            declarations.add( moduleAssembly.importedServices( specification ) );
+        }
+        return new ImportedServiceDeclaration()
+        {
+
+            @Override
+            public ImportedServiceDeclaration importOnStartup()
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.importOnStartup();
+                }
+                return this;
+            }
+
+            @Override
+            public ImportedServiceDeclaration visibleIn( Visibility visibility )
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.visibleIn( visibility );
+                }
+                return this;
+            }
+
+            @Override
+            public ImportedServiceDeclaration importedBy( Class<? extends ServiceImporter> serviceImporterClass )
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.importedBy( serviceImporterClass );
+                }
+                return this;
+            }
+
+            @Override
+            public ImportedServiceDeclaration identifiedBy( String identity )
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.identifiedBy( identity );
+                }
+                return this;
+            }
+
+            @Override
+            public ImportedServiceDeclaration taggedWith( String... tags )
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.taggedWith( tags );
+                }
+                return this;
+            }
+
+            @Override
+            public ImportedServiceDeclaration setMetaInfo( Object serviceAttribute )
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.setMetaInfo( serviceAttribute );
+                }
+                return this;
+            }
+
+            @Override
+            @SafeVarargs
+            public final ImportedServiceDeclaration withActivators( Class<? extends Activator<?>>... activators )
+            {
+                for( ImportedServiceDeclaration declaration : declarations )
+                {
+                    declaration.withActivators( activators );
+                }
+                return this;
+            }
+
+        };
+    }
+
+    Collection<ModuleAssemblyImpl> moduleAssemblies()
+    {
+        return moduleAssemblies.values();
+    }
+
+    Set<LayerAssembly> uses()
+    {
+        return uses;
+    }
+
+    public MetaInfo metaInfo()
+    {
+        return metaInfo;
+    }
+
+    @Override
+    public String name()
+    {
+        return name;
+    }
+
+    public List<Class<? extends Activator<Layer>>> activators()
+    {
+        return activators;
+    }
+
+    @Override
+    public final String toString()
+    {
+        return "LayerAssembly [" + name + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
new file mode 100644
index 0000000..673dfe7
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
@@ -0,0 +1,635 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ * Copyright (c) 2012, Paul Merlin.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.zest.api.activation.Activator;
+import org.apache.zest.api.common.MetaInfo;
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.api.composite.TransientComposite;
+import org.apache.zest.api.entity.EntityComposite;
+import org.apache.zest.api.entity.Identity;
+import org.apache.zest.api.service.DuplicateServiceIdentityException;
+import org.apache.zest.api.service.ServiceImporter;
+import org.apache.zest.api.structure.Module;
+import org.apache.zest.api.type.HasTypes;
+import org.apache.zest.api.type.MatchTypeSpecification;
+import org.apache.zest.api.value.ValueComposite;
+import org.apache.zest.bootstrap.AssemblyException;
+import org.apache.zest.bootstrap.AssemblySpecifications;
+import org.apache.zest.bootstrap.AssemblyVisitor;
+import org.apache.zest.bootstrap.ConfigurationDeclaration;
+import org.apache.zest.bootstrap.EntityAssembly;
+import org.apache.zest.bootstrap.EntityDeclaration;
+import org.apache.zest.bootstrap.ImportedServiceAssembly;
+import org.apache.zest.bootstrap.ImportedServiceDeclaration;
+import org.apache.zest.bootstrap.LayerAssembly;
+import org.apache.zest.bootstrap.MetaInfoDeclaration;
+import org.apache.zest.bootstrap.MixinDeclaration;
+import org.apache.zest.bootstrap.ModuleAssembly;
+import org.apache.zest.bootstrap.ObjectAssembly;
+import org.apache.zest.bootstrap.ObjectDeclaration;
+import org.apache.zest.bootstrap.ServiceAssembly;
+import org.apache.zest.bootstrap.ServiceDeclaration;
+import org.apache.zest.bootstrap.TransientAssembly;
+import org.apache.zest.bootstrap.TransientDeclaration;
+import org.apache.zest.bootstrap.ValueAssembly;
+import org.apache.zest.bootstrap.ValueDeclaration;
+import org.apache.zest.functional.Iterables;
+import org.apache.zest.functional.Specification;
+import org.apache.zest.functional.Specifications;
+import org.apache.zest.runtime.activation.ActivatorsModel;
+import org.apache.zest.runtime.composite.TransientModel;
+import org.apache.zest.runtime.composite.TransientsModel;
+import org.apache.zest.runtime.entity.EntitiesModel;
+import org.apache.zest.runtime.entity.EntityModel;
+import org.apache.zest.runtime.object.ObjectModel;
+import org.apache.zest.runtime.object.ObjectsModel;
+import org.apache.zest.runtime.service.ImportedServiceModel;
+import org.apache.zest.runtime.service.ImportedServicesModel;
+import org.apache.zest.runtime.service.ServiceModel;
+import org.apache.zest.runtime.service.ServicesModel;
+import org.apache.zest.runtime.structure.ModuleModel;
+import org.apache.zest.runtime.value.ValueModel;
+import org.apache.zest.runtime.value.ValuesModel;
+
+import static org.apache.zest.functional.Iterables.first;
+import static org.apache.zest.functional.Iterables.iterable;
+
+/**
+ * Assembly of a Module. This is where you register all objects, Composites,
+ * Services. Each "add" method returns a declaration that you can use to add
+ * additional information and metadata. If you call an "add" method with many
+ * parameters then the declared metadata will apply to all types in the method
+ * call.
+ */
+public final class ModuleAssemblyImpl
+    implements ModuleAssembly
+{
+    private final LayerAssembly layerAssembly;
+    private String name;
+    private final MetaInfo metaInfo = new MetaInfo();
+    private final List<Class<? extends Activator<Module>>> activators = new ArrayList<>();
+
+    private final List<ServiceAssemblyImpl> serviceAssemblies = new ArrayList<>();
+    private final Map<Class<?>, ImportedServiceAssemblyImpl> importedServiceAssemblies = new LinkedHashMap<>();
+    private final Map<Class<? extends EntityComposite>, EntityAssemblyImpl> entityAssemblies = new LinkedHashMap<>();
+    private final Map<Class<? extends ValueComposite>, ValueAssemblyImpl> valueAssemblies = new LinkedHashMap<>();
+    private final Map<Class<? extends TransientComposite>, TransientAssemblyImpl> transientAssemblies = new LinkedHashMap<>();
+    private final Map<Class<?>, ObjectAssemblyImpl> objectAssemblies = new LinkedHashMap<>();
+
+    private final MetaInfoDeclaration metaInfoDeclaration = new MetaInfoDeclaration();
+
+    public ModuleAssemblyImpl( LayerAssembly layerAssembly, String name )
+    {
+        this.layerAssembly = layerAssembly;
+        this.name = name;
+    }
+
+    @Override
+    public LayerAssembly layer()
+    {
+        return layerAssembly;
+    }
+
+    @Override
+    public ModuleAssembly module( String layerName, String moduleName )
+    {
+        return layerAssembly.application().module( layerName, moduleName );
+    }
+
+    @Override
+    public ModuleAssembly setName( String name )
+    {
+        this.name = name;
+        return this;
+    }
+
+    @Override
+    public String name()
+    {
+        return name;
+    }
+
+    public ModuleAssembly setMetaInfo( Object info )
+    {
+        metaInfo.set( info );
+        return this;
+    }
+
+    @Override
+    @SafeVarargs
+    public final ModuleAssembly withActivators( Class<? extends Activator<Module>>... activators )
+    {
+        this.activators.addAll( Arrays.asList( activators ) );
+        return this;
+    }
+
+    @Override
+    @SuppressWarnings( {"raw", "unchecked"} )
+    public ValueDeclaration values( Class<?>... valueTypes )
+    {
+        List<ValueAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class valueType : valueTypes )
+        {
+            if( valueAssemblies.containsKey( valueType ) )
+            {
+                assemblies.add( valueAssemblies.get( valueType ) );
+            }
+            else
+            {
+                ValueAssemblyImpl valueAssembly = new ValueAssemblyImpl( valueType );
+                valueAssemblies.put( valueType, valueAssembly );
+                assemblies.add( valueAssembly );
+            }
+        }
+
+        return new ValueDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ValueDeclaration values( Specification<? super ValueAssembly> specification )
+    {
+        List<ValueAssemblyImpl> assemblies = new ArrayList<>();
+        for( ValueAssemblyImpl transientAssembly : valueAssemblies.values() )
+        {
+            if( specification.satisfiedBy( transientAssembly ) )
+            {
+                assemblies.add( transientAssembly );
+            }
+        }
+
+        return new ValueDeclarationImpl( assemblies );
+    }
+
+    @Override
+    @SuppressWarnings( {"raw", "unchecked"} )
+    public TransientDeclaration transients( Class<?>... transientTypes )
+    {
+        List<TransientAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class valueType : transientTypes )
+        {
+            if( transientAssemblies.containsKey( valueType ) )
+            {
+                assemblies.add( transientAssemblies.get( valueType ) );
+            }
+            else
+            {
+                TransientAssemblyImpl transientAssembly = new TransientAssemblyImpl( valueType );
+                transientAssemblies.put( valueType, transientAssembly );
+                assemblies.add( transientAssembly );
+            }
+        }
+
+        return new TransientDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public TransientDeclaration transients( Specification<? super TransientAssembly> specification )
+    {
+        List<TransientAssemblyImpl> assemblies = new ArrayList<>();
+        for( TransientAssemblyImpl transientAssembly : transientAssemblies.values() )
+        {
+            if( specification.satisfiedBy( transientAssembly ) )
+            {
+                assemblies.add( transientAssembly );
+            }
+        }
+
+        return new TransientDeclarationImpl( assemblies );
+    }
+
+    @Override
+    @SuppressWarnings( {"raw", "unchecked"} )
+    public EntityDeclaration entities( Class<?>... entityTypes )
+    {
+        List<EntityAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class entityType : entityTypes )
+        {
+            if( entityAssemblies.containsKey( entityType ) )
+            {
+                assemblies.add( entityAssemblies.get( entityType ) );
+            }
+            else
+            {
+                EntityAssemblyImpl entityAssembly = new EntityAssemblyImpl( entityType );
+                entityAssemblies.put( entityType, entityAssembly );
+                assemblies.add( entityAssembly );
+            }
+        }
+
+        return new EntityDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public EntityDeclaration entities( Specification<? super EntityAssembly> specification )
+    {
+        List<EntityAssemblyImpl> assemblies = new ArrayList<>();
+        for( EntityAssemblyImpl entityAssembly : entityAssemblies.values() )
+        {
+            if( specification.satisfiedBy( entityAssembly ) )
+            {
+                assemblies.add( entityAssembly );
+            }
+        }
+
+        return new EntityDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ConfigurationDeclaration configurations( Class<?>... configurationTypes )
+    {
+        List<EntityAssemblyImpl> entityAssemblyList = new ArrayList<>();
+
+        for( Class entityType : configurationTypes )
+        {
+            if( this.entityAssemblies.containsKey( entityType ) )
+            {
+                entityAssemblyList.add( this.entityAssemblies.get( entityType ) );
+            }
+            else
+            {
+                EntityAssemblyImpl entityAssembly = new EntityAssemblyImpl( entityType );
+                this.entityAssemblies.put( entityType, entityAssembly );
+                entityAssemblyList.add( entityAssembly );
+            }
+        }
+
+        List<ValueAssemblyImpl> valueAssemblyList = new ArrayList<>();
+
+        for( Class valueType : configurationTypes )
+        {
+            if( valueAssemblies.containsKey( valueType ) )
+            {
+                valueAssemblyList.add( valueAssemblies.get( valueType ) );
+            }
+            else
+            {
+                ValueAssemblyImpl valueAssembly = new ValueAssemblyImpl( valueType );
+                valueAssemblies.put( valueType, valueAssembly );
+                valueAssemblyList.add( valueAssembly );
+                valueAssembly.types.add( Identity.class );
+            }
+        }
+
+        return new ConfigurationDeclarationImpl( entityAssemblyList, valueAssemblyList  );
+    }
+
+    @Override
+    public ConfigurationDeclaration configurations( Specification<HasTypes> specification )
+    {
+        Specification<HasTypes> isConfigurationComposite = new MatchTypeSpecification( Identity.class );
+        specification = Specifications.and( specification, isConfigurationComposite );
+        List<EntityAssemblyImpl> entityAssmblyList = new ArrayList<>();
+        for( EntityAssemblyImpl entityAssembly : entityAssemblies.values() )
+        {
+            if( specification.satisfiedBy( entityAssembly ) )
+            {
+                entityAssmblyList.add( entityAssembly );
+            }
+        }
+        List<ValueAssemblyImpl> valueAssemblyList = new ArrayList<>();
+        for( ValueAssemblyImpl transientAssembly : valueAssemblies.values() )
+        {
+            if( specification.satisfiedBy( transientAssembly ) )
+            {
+                valueAssemblyList.add( transientAssembly );
+            }
+        }
+        return new ConfigurationDeclarationImpl( entityAssmblyList, valueAssemblyList );
+    }
+
+    @Override
+    public ObjectDeclaration objects( Class<?>... objectTypes )
+        throws AssemblyException
+    {
+        List<ObjectAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class<?> objectType : objectTypes )
+        {
+            if( objectType.isInterface() )
+            {
+                throw new AssemblyException( "Interfaces can not be Zest Objects." );
+            }
+            if( objectAssemblies.containsKey( objectType ) )
+            {
+                assemblies.add( objectAssemblies.get( objectType ) );
+            }
+            else
+            {
+                ObjectAssemblyImpl objectAssembly = new ObjectAssemblyImpl( objectType );
+                objectAssemblies.put( objectType, objectAssembly );
+                assemblies.add( objectAssembly );
+            }
+        }
+
+        return new ObjectDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ObjectDeclaration objects( Specification<? super ObjectAssembly> specification )
+    {
+        List<ObjectAssemblyImpl> assemblies = new ArrayList<>();
+        for( ObjectAssemblyImpl objectAssembly : objectAssemblies.values() )
+        {
+            if( specification.satisfiedBy( objectAssembly ) )
+            {
+                assemblies.add( objectAssembly );
+            }
+        }
+
+        return new ObjectDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ServiceDeclaration addServices( Class<?>... serviceTypes )
+    {
+        List<ServiceAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class<?> serviceType : serviceTypes )
+        {
+            ServiceAssemblyImpl serviceAssembly = new ServiceAssemblyImpl( serviceType );
+            serviceAssemblies.add( serviceAssembly );
+            assemblies.add( serviceAssembly );
+        }
+
+        return new ServiceDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ServiceDeclaration services( Class<?>... serviceTypes )
+    {
+        List<ServiceAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class<?> serviceType : serviceTypes )
+        {
+            if( Iterables.matchesAny( AssemblySpecifications.types( serviceType ), serviceAssemblies ) )
+            {
+                Iterables.addAll( assemblies, Iterables.filter( AssemblySpecifications.types( serviceType ), serviceAssemblies ) );
+            }
+            else
+            {
+                ServiceAssemblyImpl serviceAssembly = new ServiceAssemblyImpl( serviceType );
+                serviceAssemblies.add( serviceAssembly );
+                assemblies.add( serviceAssembly );
+            }
+        }
+
+        return new ServiceDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ServiceDeclaration services( Specification<? super ServiceAssembly> specification )
+    {
+        List<ServiceAssemblyImpl> assemblies = new ArrayList<>();
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            if( specification.satisfiedBy( serviceAssembly ) )
+            {
+                assemblies.add( serviceAssembly );
+            }
+        }
+
+        return new ServiceDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ImportedServiceDeclaration importedServices( Class<?>... serviceTypes )
+    {
+        List<ImportedServiceAssemblyImpl> assemblies = new ArrayList<>();
+
+        for( Class<?> serviceType : serviceTypes )
+        {
+            if( importedServiceAssemblies.containsKey( serviceType ) )
+            {
+                assemblies.add( importedServiceAssemblies.get( serviceType ) );
+            }
+            else
+            {
+                ImportedServiceAssemblyImpl serviceAssembly = new ImportedServiceAssemblyImpl( serviceType, this );
+                importedServiceAssemblies.put( serviceType, serviceAssembly );
+                assemblies.add( serviceAssembly );
+            }
+        }
+
+        return new ImportedServiceDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public ImportedServiceDeclaration importedServices( Specification<? super ImportedServiceAssembly> specification )
+    {
+        List<ImportedServiceAssemblyImpl> assemblies = new ArrayList<>();
+        for( ImportedServiceAssemblyImpl objectAssembly : importedServiceAssemblies.values() )
+        {
+            if( specification.satisfiedBy( objectAssembly ) )
+            {
+                assemblies.add( objectAssembly );
+            }
+        }
+
+        return new ImportedServiceDeclarationImpl( assemblies );
+    }
+
+    @Override
+    public <T> MixinDeclaration<T> forMixin( Class<T> mixinType )
+    {
+        return metaInfoDeclaration.on( mixinType );
+    }
+
+    @Override
+    public <ThrowableType extends Throwable> void visit( AssemblyVisitor<ThrowableType> visitor )
+        throws ThrowableType
+    {
+        visitor.visitModule( this );
+
+        for( TransientAssemblyImpl compositeDeclaration : transientAssemblies.values() )
+        {
+            visitor.visitComposite( new TransientDeclarationImpl( iterable( compositeDeclaration ) ) );
+        }
+
+        for( EntityAssemblyImpl entityDeclaration : entityAssemblies.values() )
+        {
+            visitor.visitEntity( new EntityDeclarationImpl( iterable( entityDeclaration ) ) );
+        }
+
+        for( ObjectAssemblyImpl objectDeclaration : objectAssemblies.values() )
+        {
+            visitor.visitObject( new ObjectDeclarationImpl( iterable( objectDeclaration ) ) );
+        }
+
+        for( ServiceAssemblyImpl serviceDeclaration : serviceAssemblies )
+        {
+            visitor.visitService( new ServiceDeclarationImpl( iterable( serviceDeclaration ) ) );
+        }
+
+        for( ImportedServiceAssemblyImpl importedServiceDeclaration : importedServiceAssemblies.values() )
+        {
+            visitor.visitImportedService( new ImportedServiceDeclarationImpl( iterable( importedServiceDeclaration ) ) );
+        }
+
+        for( ValueAssemblyImpl valueDeclaration : valueAssemblies.values() )
+        {
+            visitor.visitValue( new ValueDeclarationImpl( iterable( valueDeclaration ) ) );
+        }
+    }
+
+    ModuleModel assembleModule( AssemblyHelper helper )
+        throws AssemblyException
+    {
+        List<TransientModel> transientModels = new ArrayList<>();
+        List<ObjectModel> objectModels = new ArrayList<>();
+        List<ValueModel> valueModels = new ArrayList<>();
+        List<ServiceModel> serviceModels = new ArrayList<>();
+        List<ImportedServiceModel> importedServiceModels = new ArrayList<>();
+
+        if( name == null )
+        {
+            throw new AssemblyException( "Module must have name set" );
+        }
+
+        for( TransientAssemblyImpl compositeDeclaration : transientAssemblies.values() )
+        {
+            transientModels.add( compositeDeclaration.newTransientModel( metaInfoDeclaration, helper ) );
+        }
+
+        for( ValueAssemblyImpl valueDeclaration : valueAssemblies.values() )
+        {
+            valueModels.add( valueDeclaration.newValueModel( metaInfoDeclaration, helper ) );
+        }
+
+        List<EntityModel> entityModels = new ArrayList<>();
+        for( EntityAssemblyImpl entityDeclaration : entityAssemblies.values() )
+        {
+            entityModels.add( entityDeclaration.newEntityModel( metaInfoDeclaration, 
+                                                                metaInfoDeclaration, 
+                                                                metaInfoDeclaration, 
+                                                                metaInfoDeclaration, 
+                                                                helper ) );
+        }
+
+        for( ObjectAssemblyImpl objectDeclaration : objectAssemblies.values() )
+        {
+            objectDeclaration.addObjectModel( objectModels );
+        }
+
+        for( ServiceAssemblyImpl serviceDeclaration : serviceAssemblies )
+        {
+            if( serviceDeclaration.identity == null )
+            {
+                serviceDeclaration.identity = generateId( serviceDeclaration.types() );
+            }
+
+            serviceModels.add( serviceDeclaration.newServiceModel( metaInfoDeclaration, helper ) );
+        }
+
+        for( ImportedServiceAssemblyImpl importedServiceDeclaration : importedServiceAssemblies.values() )
+        {
+            importedServiceDeclaration.addImportedServiceModel( importedServiceModels );
+        }
+
+        ModuleModel moduleModel = new ModuleModel( name,
+                                                   metaInfo,
+                                                   new ActivatorsModel<>( activators ),
+                                                   new TransientsModel( transientModels ),
+                                                   new EntitiesModel( entityModels ),
+                                                   new ObjectsModel( objectModels ),
+                                                   new ValuesModel( valueModels ),
+                                                   new ServicesModel( serviceModels ),
+                                                   new ImportedServicesModel( importedServiceModels ) );
+
+        // Check for duplicate service identities
+        Set<String> identities = new HashSet<>();
+        for( ServiceModel serviceModel : serviceModels )
+        {
+            String identity = serviceModel.identity();
+            if( identities.contains( identity ) )
+            {
+                throw new DuplicateServiceIdentityException(
+                    "Duplicated service identity: " + identity + " in module " + moduleModel.name()
+                );
+            }
+            identities.add( identity );
+        }
+        for( ImportedServiceModel serviceModel : importedServiceModels )
+        {
+            String identity = serviceModel.identity();
+            if( identities.contains( identity ) )
+            {
+                throw new DuplicateServiceIdentityException(
+                    "Duplicated service identity: " + identity + " in module " + moduleModel.name()
+                );
+            }
+            identities.add( identity );
+        }
+
+        for( ImportedServiceModel importedServiceModel : importedServiceModels )
+        {
+            boolean found = false;
+            for( ObjectModel objectModel : objectModels )
+            {
+                if( first( objectModel.types() ).equals( importedServiceModel.serviceImporter() ) )
+                {
+                    found = true;
+                    break;
+                }
+            }
+            if( !found )
+            {
+                @SuppressWarnings( "raw" )
+                Class<? extends ServiceImporter> serviceFactoryType = importedServiceModel.serviceImporter();
+                ObjectModel objectModel = new ObjectModel( serviceFactoryType, Visibility.module, new MetaInfo() );
+                objectModels.add( objectModel );
+            }
+        }
+
+        return moduleModel;
+    }
+
+    private String generateId( Iterable<Class<?>> serviceTypes )
+    {
+        // Find service identity that is not yet used
+        Class<?> serviceType = serviceTypes.iterator()
+            .next(); // Use the first Iterable, which *SHOULD* be the main serviceType
+        int idx = 0;
+        String id = serviceType.getSimpleName();
+        boolean invalid;
+        do
+        {
+            invalid = false;
+            for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+            {
+                if( serviceAssembly.identity() != null && serviceAssembly.identity().equals( id ) )
+                {
+                    idx++;
+                    id = serviceType.getSimpleName() + "_" + idx;
+                    invalid = true;
+                    break;
+                }
+            }
+        }
+        while( invalid );
+        return id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectAssemblyImpl.java
new file mode 100644
index 0000000..f4fdd9c
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectAssemblyImpl.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.lang.reflect.Modifier;
+import java.util.List;
+import org.apache.zest.api.common.InvalidApplicationException;
+import org.apache.zest.api.common.MetaInfo;
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.api.composite.Composite;
+import org.apache.zest.bootstrap.ObjectAssembly;
+import org.apache.zest.functional.Iterables;
+import org.apache.zest.runtime.object.ObjectModel;
+
+/**
+ * Assembly of an Object.
+ */
+public final class ObjectAssemblyImpl
+    implements ObjectAssembly
+{
+    private Class<?> objectType;
+    MetaInfo metaInfo = new MetaInfo();
+    Visibility visibility = Visibility.module;
+
+    public ObjectAssemblyImpl( Class<?> clazz )
+    {
+        // best try to find out if the class is a concrete class
+        if( clazz.isEnum() ||
+            ( !Composite.class.isAssignableFrom( clazz ) && Modifier.isAbstract( clazz.getModifiers() ) ) )
+        {
+            throw new IllegalArgumentException( "Declared objects must be concrete classes: " + clazz );
+        }
+        this.objectType = clazz;
+    }
+
+    @Override
+    public Iterable<Class<?>> types()
+    {
+        return Iterables.<Class<?>>iterable( objectType );
+    }
+
+    void addObjectModel( List<ObjectModel> objectModels )
+    {
+        try
+        {
+            ObjectModel objectModel = new ObjectModel( objectType, visibility, metaInfo );
+            objectModels.add( objectModel );
+        }
+        catch( Throwable e )
+        {
+            throw new InvalidApplicationException( "Could not register " + objectType.getName(), e );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectDeclarationImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectDeclarationImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectDeclarationImpl.java
new file mode 100644
index 0000000..8a1af93
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ObjectDeclarationImpl.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.bootstrap.ObjectDeclaration;
+
+/**
+ * Declaration of an Object. Created by {@link org.apache.zest.runtime.bootstrap.ModuleAssemblyImpl#objects(Class[])}.
+ */
+public final class ObjectDeclarationImpl
+    implements ObjectDeclaration
+{
+    private final Iterable<ObjectAssemblyImpl> assemblies;
+
+    public ObjectDeclarationImpl( Iterable<ObjectAssemblyImpl> assemblies )
+    {
+        this.assemblies = assemblies;
+    }
+
+    @Override
+    public ObjectDeclaration setMetaInfo( Object info )
+    {
+        for( ObjectAssemblyImpl assembly : assemblies )
+        {
+            assembly.metaInfo.set( info );
+        }
+        return this;
+    }
+
+    @Override
+    public ObjectDeclaration visibleIn( Visibility visibility )
+        throws IllegalStateException
+    {
+        for( ObjectAssemblyImpl assembly : assemblies )
+        {
+            assembly.visibility = visibility;
+        }
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/OrAppliesToFilter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/OrAppliesToFilter.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/OrAppliesToFilter.java
new file mode 100644
index 0000000..90136b1
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/OrAppliesToFilter.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2008, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.lang.reflect.Method;
+import org.apache.zest.api.common.AppliesToFilter;
+
+/**
+ * JAVADOC
+ */
+final class OrAppliesToFilter
+    implements AppliesToFilter
+{
+    private final AppliesToFilter left;
+    private final AppliesToFilter right;
+
+    OrAppliesToFilter( AppliesToFilter left, AppliesToFilter right )
+    {
+        this.left = left;
+        this.right = right;
+    }
+
+    @Override
+    public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> fragmentClass )
+    {
+        return left.appliesTo( method, mixin, compositeType, fragmentClass ) ||
+               right.appliesTo( method, mixin, compositeType, fragmentClass );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceAssemblyImpl.java
new file mode 100644
index 0000000..530aeb7
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceAssemblyImpl.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ * Copyright (c) 2012, Paul Merlin.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.zest.api.activation.Activator;
+import org.apache.zest.api.activation.Activators;
+import org.apache.zest.api.common.InvalidApplicationException;
+import org.apache.zest.api.service.ServiceComposite;
+import org.apache.zest.api.util.Annotations;
+import org.apache.zest.api.util.Classes;
+import org.apache.zest.bootstrap.ServiceAssembly;
+import org.apache.zest.bootstrap.StateDeclarations;
+import org.apache.zest.functional.Function;
+import org.apache.zest.functional.Iterables;
+import org.apache.zest.runtime.activation.ActivatorsModel;
+import org.apache.zest.runtime.service.ServiceModel;
+
+/**
+ * Assembly of a Service.
+ */
+public final class ServiceAssemblyImpl extends CompositeAssemblyImpl
+    implements ServiceAssembly
+{
+    String identity;
+    boolean instantiateOnStartup = false;
+    List<Class<? extends Activator<?>>> activators = new ArrayList<>();
+
+    public ServiceAssemblyImpl( Class<?> serviceType )
+    {
+        super( serviceType );
+        // The composite must always implement ServiceComposite, as a marker interface
+        if( !ServiceComposite.class.isAssignableFrom( serviceType ) )
+        {
+            types.add( ServiceComposite.class );
+        }
+    }
+
+    @Override
+    public String identity()
+    {
+        return identity;
+    }
+
+    @SuppressWarnings( {"raw", "unchecked"} )
+    ServiceModel newServiceModel( StateDeclarations stateDeclarations, AssemblyHelper helper )
+    {
+        try
+        {
+            buildComposite( helper, stateDeclarations );
+            List<Class<? extends Activator<?>>> activatorClasses = Iterables.toList(
+                    Iterables.<Class<? extends Activator<?>>>flatten( activators, activatorsDeclarations( types ) ) );
+            return new ServiceModel( types, visibility, metaInfo,
+                                     new ActivatorsModel( activatorClasses ),
+                                     mixinsModel, stateModel, compositeMethodsModel,
+                                     identity, instantiateOnStartup );
+        }
+        catch( Exception e )
+        {
+            throw new InvalidApplicationException( "Could not register " + types, e );
+        }
+    }
+    
+    private Iterable<Class<? extends Activator<?>>> activatorsDeclarations( Iterable<? extends Class<?>> typess )
+    {
+        // Find activator declarations
+        ArrayList<Type> allTypes = new ArrayList<>();
+        for( Class<?> type : typess )
+        {
+            Iterable<Type> types = Classes.typesOf( type );
+            Iterables.addAll( allTypes, types );
+        }
+        // Find all activators and flattern them into an iterable
+        Function<Type, Iterable<Class<? extends Activator<?>>>> function = new Function<Type, Iterable<Class<? extends Activator<?>>>>()
+        {
+            @Override
+            public Iterable<Class<? extends Activator<?>>> map( Type type )
+            {
+                Activators activators = Annotations.annotationOn( type, Activators.class );
+                if( activators == null )
+                {
+                    return Iterables.empty();
+                }
+                else
+                {
+                    return Iterables.iterable( activators.value() );
+                }
+            }
+        };
+        Iterable<Class<? extends Activator<?>>> flatten = Iterables.flattenIterables( Iterables.map( function, allTypes ) );
+        return Iterables.toList( flatten );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceDeclarationImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceDeclarationImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceDeclarationImpl.java
new file mode 100644
index 0000000..78c5ddb
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ServiceDeclarationImpl.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ * Copyright (c) 2012, Paul Merlin.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.zest.api.activation.Activator;
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.api.service.qualifier.ServiceTags;
+import org.apache.zest.bootstrap.ServiceDeclaration;
+
+import static java.util.Arrays.asList;
+
+/**
+ * Declaration of a Service. Created by {@link org.apache.zest.runtime.bootstrap.ModuleAssemblyImpl#services(Class[])}.
+ */
+public final class ServiceDeclarationImpl
+    implements ServiceDeclaration
+{
+    private final Iterable<ServiceAssemblyImpl> serviceAssemblies;
+
+    public ServiceDeclarationImpl( Iterable<ServiceAssemblyImpl> serviceAssemblies )
+    {
+        this.serviceAssemblies = serviceAssemblies;
+    }
+
+    @Override
+    public ServiceDeclaration visibleIn( Visibility visibility )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.visibility = visibility;
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration identifiedBy( String identity )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.identity = identity;
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration taggedWith( String... tags )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            ServiceTags previousTags = serviceAssembly.metaInfo.get( ServiceTags.class );
+            if( previousTags != null )
+            {
+                List<String> tagList = new ArrayList<>();
+                tagList.addAll( asList( previousTags.tags() ) );
+                tagList.addAll( asList( tags ) );
+                serviceAssembly.metaInfo.set( new ServiceTags( tagList.toArray( new String[ tagList.size() ] ) ) );
+            }
+            else
+            {
+                serviceAssembly.metaInfo.set( new ServiceTags( tags ) );
+            }
+        }
+
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration instantiateOnStartup()
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.instantiateOnStartup = true;
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration setMetaInfo( Object serviceAttribute )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.metaInfo.set( serviceAttribute );
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration withConcerns( Class<?>... concerns )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.concerns.addAll( asList( concerns ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration withSideEffects( Class<?>... sideEffects )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.sideEffects.addAll( asList( sideEffects ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration withMixins( Class<?>... mixins )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.mixins.addAll( asList( mixins ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ServiceDeclaration withTypes( Class<?>... types )
+    {
+        for( ServiceAssemblyImpl serviceAssembly : serviceAssemblies )
+        {
+            serviceAssembly.types.addAll( asList( types ) );
+        }
+        return this;
+    }
+
+    @Override
+    @SafeVarargs
+    public final ServiceDeclaration withActivators( Class<? extends Activator<?>>... activators )
+    {
+        for ( ServiceAssemblyImpl serviceAssembly : serviceAssemblies ) {
+            serviceAssembly.activators.addAll( asList( activators ) );
+        }
+        return this;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientAssemblyImpl.java
new file mode 100644
index 0000000..8f3dcdc
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientAssemblyImpl.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import org.apache.zest.api.common.InvalidApplicationException;
+import org.apache.zest.api.composite.TransientComposite;
+import org.apache.zest.bootstrap.StateDeclarations;
+import org.apache.zest.bootstrap.TransientAssembly;
+import org.apache.zest.runtime.composite.TransientModel;
+
+/**
+ * Declaration of a TransientComposite.
+ */
+public final class TransientAssemblyImpl extends CompositeAssemblyImpl
+    implements TransientAssembly
+{
+    public TransientAssemblyImpl( Class<?> transientType )
+    {
+        super( transientType );
+
+        // The composite must always implement TransientComposite, as a marker interface
+        if( !TransientComposite.class.isAssignableFrom( transientType ) )
+        {
+            types.add( TransientComposite.class );
+        }
+
+        // If type is a class, register it as a mixin
+        if( !transientType.isInterface() )
+        {
+            mixins.add( transientType );
+        }
+    }
+
+    TransientModel newTransientModel( StateDeclarations stateDeclarations, AssemblyHelper helper )
+    {
+        try
+        {
+            buildComposite( helper, stateDeclarations );
+            TransientModel transientModel = new TransientModel(
+                types, visibility, metaInfo, mixinsModel, stateModel, compositeMethodsModel );
+
+            return transientModel;
+        }
+        catch( Exception e )
+        {
+            throw new InvalidApplicationException( "Could not register " + types, e );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientDeclarationImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientDeclarationImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientDeclarationImpl.java
new file mode 100644
index 0000000..c137202
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TransientDeclarationImpl.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.bootstrap.TransientDeclaration;
+
+import static java.util.Arrays.asList;
+
+/**
+ * Declaration of a Composite. Created by {@link org.apache.zest.bootstrap.ModuleAssembly#transients(Class[])}.
+ */
+public final class TransientDeclarationImpl
+    implements TransientDeclaration
+{
+    private final Iterable<TransientAssemblyImpl> assemblies;
+
+    public TransientDeclarationImpl( Iterable<TransientAssemblyImpl> assemblies )
+    {
+        this.assemblies = assemblies;
+    }
+
+    @Override
+    public TransientDeclaration setMetaInfo( Object info )
+    {
+        for( TransientAssemblyImpl assembly : assemblies )
+        {
+            assembly.metaInfo.set( info );
+        }
+        return this;
+    }
+
+    @Override
+    public TransientDeclaration visibleIn( Visibility visibility )
+    {
+        for( TransientAssemblyImpl assembly : assemblies )
+        {
+            assembly.visibility = visibility;
+        }
+        return this;
+    }
+
+    @Override
+    public TransientDeclaration withConcerns( Class<?>... concerns )
+    {
+        for( TransientAssemblyImpl assembly : assemblies )
+        {
+            assembly.concerns.addAll( asList( concerns ) );
+        }
+        return this;
+    }
+
+    @Override
+    public TransientDeclaration withSideEffects( Class<?>... sideEffects )
+    {
+        for( TransientAssemblyImpl assembly : assemblies )
+        {
+            assembly.sideEffects.addAll( asList( sideEffects ) );
+        }
+        return this;
+    }
+
+    @Override
+    public TransientDeclaration withMixins( Class<?>... mixins )
+    {
+        for( TransientAssemblyImpl assembly : assemblies )
+        {
+            assembly.mixins.addAll( asList( mixins ) );
+        }
+        return this;
+    }
+
+    @Override
+    public TransientDeclaration withTypes( Class<?>... types )
+    {
+        for( TransientAssemblyImpl assembly : assemblies )
+        {
+            assembly.types.addAll( asList( types ) );
+        }
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypeCheckAppliesToFilter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypeCheckAppliesToFilter.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypeCheckAppliesToFilter.java
new file mode 100644
index 0000000..519ad4f
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypeCheckAppliesToFilter.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2008, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.lang.reflect.Method;
+import org.apache.zest.api.common.AppliesToFilter;
+
+/**
+ * JAVADOC
+ */
+final class TypeCheckAppliesToFilter
+    implements AppliesToFilter
+{
+    @SuppressWarnings( "raw" )
+    private final Class type;
+
+    @SuppressWarnings( "raw" )
+    TypeCheckAppliesToFilter( Class type )
+    {
+        this.type = type;
+    }
+
+    @Override
+    @SuppressWarnings( "unchecked" )
+    public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> fragmentClass )
+    {
+        return type.isAssignableFrom( compositeType );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypedFragmentAppliesToFilter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypedFragmentAppliesToFilter.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypedFragmentAppliesToFilter.java
new file mode 100644
index 0000000..f2bf128
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/TypedFragmentAppliesToFilter.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2008, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.lang.reflect.Method;
+import org.apache.zest.api.common.AppliesToFilter;
+
+/**
+ * JAVADOC
+ */
+final class TypedFragmentAppliesToFilter
+    implements AppliesToFilter
+{
+    @Override
+    public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> fragmentClass )
+    {
+        return method.getDeclaringClass().isAssignableFrom( fragmentClass );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueAssemblyImpl.java
new file mode 100644
index 0000000..268ba75
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueAssemblyImpl.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2007-2011, Rickard Öberg. All Rights Reserved.
+ * Copyright (c) 2014, Paul Merlin. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Member;
+import org.apache.zest.api.association.Association;
+import org.apache.zest.api.association.GenericAssociationInfo;
+import org.apache.zest.api.association.ManyAssociation;
+import org.apache.zest.api.association.NamedAssociation;
+import org.apache.zest.api.common.InvalidApplicationException;
+import org.apache.zest.api.common.MetaInfo;
+import org.apache.zest.api.common.Optional;
+import org.apache.zest.api.common.QualifiedName;
+import org.apache.zest.api.common.UseDefaults;
+import org.apache.zest.api.constraint.Constraint;
+import org.apache.zest.api.property.GenericPropertyInfo;
+import org.apache.zest.api.property.Property;
+import org.apache.zest.api.util.Annotations;
+import org.apache.zest.api.util.Classes;
+import org.apache.zest.api.value.ValueComposite;
+import org.apache.zest.bootstrap.StateDeclarations;
+import org.apache.zest.bootstrap.ValueAssembly;
+import org.apache.zest.runtime.association.AssociationModel;
+import org.apache.zest.runtime.association.AssociationsModel;
+import org.apache.zest.runtime.association.ManyAssociationModel;
+import org.apache.zest.runtime.association.ManyAssociationsModel;
+import org.apache.zest.runtime.association.NamedAssociationModel;
+import org.apache.zest.runtime.association.NamedAssociationsModel;
+import org.apache.zest.runtime.composite.StateModel;
+import org.apache.zest.runtime.composite.ValueConstraintsInstance;
+import org.apache.zest.runtime.composite.ValueConstraintsModel;
+import org.apache.zest.runtime.property.PropertyModel;
+import org.apache.zest.runtime.value.ValueModel;
+import org.apache.zest.runtime.value.ValueStateModel;
+
+import static org.apache.zest.api.util.Annotations.isType;
+import static org.apache.zest.api.util.Classes.typeOf;
+import static org.apache.zest.functional.Iterables.filter;
+import static org.apache.zest.functional.Iterables.first;
+
+/**
+ * Declaration of a ValueComposite.
+ */
+public final class ValueAssemblyImpl
+    extends CompositeAssemblyImpl
+    implements ValueAssembly
+{
+    private AssociationsModel associationsModel;
+    private ManyAssociationsModel manyAssociationsModel;
+    private NamedAssociationsModel namedAssociationsModel;
+
+    public ValueAssemblyImpl( Class<?> compositeType )
+    {
+        super( compositeType );
+        // The composite must always implement ValueComposite, as a marker interface
+        if( !ValueComposite.class.isAssignableFrom( compositeType ) )
+        {
+            types.add( ValueComposite.class );
+        }
+    }
+
+    @Override
+    protected StateModel createStateModel()
+    {
+        return new ValueStateModel( propertiesModel, associationsModel, manyAssociationsModel, namedAssociationsModel );
+    }
+
+    ValueModel newValueModel(
+        StateDeclarations stateDeclarations,
+        AssemblyHelper helper
+    )
+    {
+        try
+        {
+            associationsModel = new AssociationsModel();
+            manyAssociationsModel = new ManyAssociationsModel();
+            namedAssociationsModel = new NamedAssociationsModel();
+            buildComposite( helper, stateDeclarations );
+
+            ValueModel valueModel = new ValueModel(
+                types, visibility, metaInfo, mixinsModel, (ValueStateModel) stateModel, compositeMethodsModel );
+
+            return valueModel;
+        }
+        catch( Exception e )
+        {
+            throw new InvalidApplicationException( "Could not register " + types, e );
+        }
+    }
+
+    @Override
+    protected void addStateFor( AccessibleObject accessor,
+                                Iterable<Class<? extends Constraint<?, ?>>> constraintClasses
+    )
+    {
+        String stateName = QualifiedName.fromAccessor( accessor ).name();
+
+        if( registeredStateNames.contains( stateName ) )
+        {
+            return; // Skip already registered names
+        }
+
+        Class<?> accessorType = Classes.RAW_CLASS.map( typeOf( accessor ) );
+        if( Property.class.isAssignableFrom( accessorType ) )
+        {
+            propertiesModel.addProperty( newPropertyModel( accessor, constraintClasses ) );
+            registeredStateNames.add( stateName );
+        }
+        else if( Association.class.isAssignableFrom( accessorType ) )
+        {
+            associationsModel.addAssociation( newAssociationModel( accessor, constraintClasses ) );
+            registeredStateNames.add( stateName );
+        }
+        else if( ManyAssociation.class.isAssignableFrom( accessorType ) )
+        {
+            manyAssociationsModel.addManyAssociation( newManyAssociationModel( accessor, constraintClasses ) );
+            registeredStateNames.add( stateName );
+        }
+        else if( NamedAssociation.class.isAssignableFrom( accessorType ) )
+        {
+            namedAssociationsModel.addNamedAssociation( newNamedAssociationModel( accessor, constraintClasses ) );
+            registeredStateNames.add( stateName );
+        }
+    }
+
+    @Override
+    protected PropertyModel newPropertyModel( AccessibleObject accessor,
+                                              Iterable<Class<? extends Constraint<?, ?>>> constraintClasses
+    )
+    {
+        Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn( accessor );
+        boolean optional = first( filter( isType( Optional.class ), annotations ) ) != null;
+        ValueConstraintsModel valueConstraintsModel = constraintsFor( annotations, GenericPropertyInfo.propertyTypeOf( accessor ), ( (Member) accessor )
+            .getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance valueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            valueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+        MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
+        boolean useDefaults = metaInfo.get( UseDefaults.class ) != null || stateDeclarations.useDefaults( accessor );
+        Object initialValue = stateDeclarations.initialValueOf( accessor );
+        return new PropertyModel( accessor, true, useDefaults, valueConstraintsInstance, metaInfo, initialValue );
+    }
+
+    public AssociationModel newAssociationModel( AccessibleObject accessor,
+                                                 Iterable<Class<? extends Constraint<?, ?>>> constraintClasses
+    )
+    {
+        Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn( accessor );
+        boolean optional = first( filter( isType( Optional.class ), annotations ) ) != null;
+
+        // Constraints for Association references
+        ValueConstraintsModel valueConstraintsModel = constraintsFor( annotations, GenericAssociationInfo
+            .associationTypeOf( accessor ), ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance valueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            valueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+
+        // Constraints for the Association itself
+        valueConstraintsModel = constraintsFor( annotations, Association.class, ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance associationValueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            associationValueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+
+        MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
+        AssociationModel associationModel = new AssociationModel( accessor, valueConstraintsInstance, associationValueConstraintsInstance, metaInfo );
+        return associationModel;
+    }
+
+    public ManyAssociationModel newManyAssociationModel( AccessibleObject accessor,
+                                                         Iterable<Class<? extends Constraint<?, ?>>> constraintClasses
+    )
+    {
+        Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn( accessor );
+        boolean optional = first( filter( isType( Optional.class ), annotations ) ) != null;
+
+        // Constraints for entities in ManyAssociation
+        ValueConstraintsModel valueConstraintsModel = constraintsFor( annotations, GenericAssociationInfo
+            .associationTypeOf( accessor ), ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance valueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            valueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+
+        // Constraints for the ManyAssociation itself
+        valueConstraintsModel = constraintsFor( annotations, ManyAssociation.class, ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance manyValueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            manyValueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+        MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
+        ManyAssociationModel associationModel = new ManyAssociationModel( accessor, valueConstraintsInstance, manyValueConstraintsInstance, metaInfo );
+        return associationModel;
+    }
+    
+    public NamedAssociationModel newNamedAssociationModel( AccessibleObject accessor,
+                                                           Iterable<Class<? extends Constraint<?, ?>>> constraintClasses
+    )
+    {
+        Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn( accessor );
+        boolean optional = first( filter( isType( Optional.class ), annotations ) ) != null;
+
+        // Constraints for entities in NamedAssociation
+        ValueConstraintsModel valueConstraintsModel = constraintsFor( annotations, GenericAssociationInfo
+            .associationTypeOf( accessor ), ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance valueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            valueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+
+        // Constraints for the NamedAssociation itself
+        valueConstraintsModel = constraintsFor( annotations, NamedAssociation.class, ( (Member) accessor ).getName(), optional, constraintClasses, accessor );
+        ValueConstraintsInstance namedValueConstraintsInstance = null;
+        if( valueConstraintsModel.isConstrained() )
+        {
+            namedValueConstraintsInstance = valueConstraintsModel.newInstance();
+        }
+        MetaInfo metaInfo = stateDeclarations.metaInfoFor( accessor );
+        NamedAssociationModel associationModel = new NamedAssociationModel( accessor, valueConstraintsInstance, namedValueConstraintsInstance, metaInfo );
+        return associationModel;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8744a67f/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueDeclarationImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueDeclarationImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueDeclarationImpl.java
new file mode 100644
index 0000000..24c9c8e
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ValueDeclarationImpl.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2007, Rickard Öberg. All Rights Reserved.
+ *
+ * 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.zest.runtime.bootstrap;
+
+import org.apache.zest.api.common.Visibility;
+import org.apache.zest.bootstrap.ValueDeclaration;
+
+import static java.util.Arrays.asList;
+
+/**
+ * Declaration of a ValueComposite.
+ */
+public final class ValueDeclarationImpl
+    implements ValueDeclaration
+{
+    private final Iterable<ValueAssemblyImpl> assemblies;
+
+    public ValueDeclarationImpl( Iterable<ValueAssemblyImpl> assemblies )
+    {
+        this.assemblies = assemblies;
+    }
+
+    @Override
+    public ValueDeclaration setMetaInfo( Object info )
+    {
+        for( ValueAssemblyImpl assembly : assemblies )
+        {
+            assembly.metaInfo.set( info );
+        }
+        return this;
+    }
+
+    @Override
+    public ValueDeclaration visibleIn( Visibility visibility )
+    {
+        for( ValueAssemblyImpl assembly : assemblies )
+        {
+            assembly.visibility = visibility;
+        }
+        return this;
+    }
+
+    @Override
+    public ValueDeclaration withConcerns( Class<?>... concerns )
+    {
+        for( ValueAssemblyImpl assembly : assemblies )
+        {
+            assembly.concerns.addAll( asList( concerns ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ValueDeclaration withSideEffects( Class<?>... sideEffects )
+    {
+        for( ValueAssemblyImpl assembly : assemblies )
+        {
+            assembly.sideEffects.addAll( asList( sideEffects ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ValueDeclaration withMixins( Class<?>... mixins )
+    {
+        for( ValueAssemblyImpl assembly : assemblies )
+        {
+            assembly.mixins.addAll( asList( mixins ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ValueDeclaration withTypes( Class<?>... types )
+    {
+        for( ValueAssemblyImpl assembly : assemblies )
+        {
+            assembly.types.addAll( asList( types ) );
+        }
+        return this;
+    }
+}
\ No newline at end of file