//////////////////////
 * 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-object,Objects]]
= Objects =
There are times when Apache Zest needs to interoperate with other systems, which
does not have interfaces as their abstraction. Zest has a notion of
Objects, which are Zest-managed classes and can still be injected with
the Zest runtime model, such as @Structure and @Service.


The characteristics of an Object compared to Composite meta types are;

    * It is a Class, not an interface.
    * It can have injections applied to it after it has been created.
    * No Mixins, Concerns or SideEffects.
    * No Constraints.
    * Can not have Property instances managed by the Zest runtime.

== Serialization ==
Objects can be serialized and deserialized using the ValueSerialization API, if and only
if they are used as types in Properties in Values or Entities. It depends on the
ValueSerialization implementation on how the objects are serialized, and
what the requirements are to allow for deserialization. In general, the Spring
POJO setter/getter approach will always work, a default constructor is needed, and
to be safe, make it into +java.io.Serializable+.

== Usage ==
Objects are instantiated either by calling +ObjectFactory.newObject( type, ... )+ or
instantiating it in some other fashion and then call +ObjectFactory.injectInto(...)+
to populate the fields.
