blob: 467fd7a048e5860de70ca5973a841b7590a90198 [file] [log] [blame]
//////////////////////
* Copyright (c) 2007-2012, Niclas Hedhman. 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.
//////////////////////
[[core-api-composition, Composition]]
= Composition =
Composition is at the heart of COP, and refers to two different levels of constructs;
1. the ability to assemble (compose) objects from smaller pieces, called Fragments.
2. the construction of applications by assembling Composites into Modules and Modules into Layers.
In Zest, we use the term Assembly for the second case of composition. See separate chapter.
Composition will allow library authors a new level of flexibility in how functionality is provided to client code. More
on that later.
== Fragments ==
There are 4 types of Fragments in Zest;
* <<core-api-mixin>> - The state carrying part of a Composite.
* <<core-api-constraint>> - Rules for in and out arguments, typically used for validation.
* <<core-api-concern>> - Interceptor of method calls. General purpose use, often for cross-cutting behaviors.
* <<core-api-sideeffect>> - Executed after the method call has been completed, and unable to influence the
outcome of the method call.
== Composites ==
There are 4 Composite meta types. Each of these have very different characteristics and it is important to understand
these, so the right meta type is used for the right purpose.
* Entity - Classic meaning. Has an Identity. Is persistable and can be referenced by the Identity. Can act as
Aggregate. Entity supports Lifecycle interface. Equals is defined by the Identity.
* Value - Values are persistable when used in a Property from an Entity. Values are immutable, and equals is
defined by the values of its fields.
* Service - Service is injectable to other composites and java objects. They are not persistable, but if
referenced from an Entity or Value, a new reference to the Service will be injected when the Entity/Value is
deserialized. Services are singletons. There are 'hosted' and 'imported' Services. The 'hosted' Service has
Configuration and its life cycle controlled by the Zestâ„¢ runtime, whereas the 'imported' Services are external
references.
* Transient - Short-lived composites that are not persistable. Equals/hashCode/toString are forwarded to the
Mixin Type declaring those methods explicitly.
In versions of Zestâ„¢ prior to 2.0 (then Qi4j), composite types had to extend one of these 4 meta types, but in 2.0 and later, the
meta type interface is added dynamically during <<core-bootstrap-assembly>>.
We can therefor get rid of a lot of additional types, and use Zest-free interfaces directly;
[snippet,java]
-----------
source=core/api/src/test/java/org/qi4j/api/docsupport/CompositionDocs.java
tag=comp1
-----------
and declare it with;
[snippet,java]
-----------
source=core/api/src/test/java/org/qi4j/api/docsupport/CompositionDocs.java
tag=comp2
-----------