///////////////////////////////////////////////////////////////
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
///////////////////////////////////////////////////////////////

[[howto-invocation-annotation,Use @Invocation]]
= Use @Invocation =
The @Invocation annotation is relatively unknown but can be rather powerful to use, especially when creating
libraries that needs to be flexible of what the user needs to do.

@Invocation is a different +InjectionScope+, which is a concept to tell Zest runtime where to look for the
instances to be injected. Other, more well-known, +InjectionScope+ annotations are +@This+, +@Structure+ and
+@Service+.

The +@Invocation+ injection scope can provide the following types, all related to the on-going method invocation,
which is especially useful in Generic Concerns or Generic Mixins;

    * +java.lang.reflect.Method+ - The current method being invoked.
    * +java.lang.reflect.AnnotatedElement+ - An descriptor for all annotations of the Method.
    * _Custom Annotations_ - Your own annotation type.
    * +java.util.Iterable<Method>+ - An iterable of all declared methods of the composite type.

== java.lang.reflect.Method ==
This injection will simply provide the +java.lang.reflect.Method+ of the on-going call. For generic fragments that
will be the same as the second argument in the +java.lang.reflect.InvocationHandler.invoke()+ method. Sometimes
it is useful to obtain this for typed fragment as well, to reduce names in Strings.

== java.lang.reflect.AnnotatedElement ==
This Reflection API class encapsulates the annotation aspect of any element that can be annotated. Zest implements
this interface for the Composite. That means that annotations for both the method as well as the composite is provided
through this injection.

== Custom Annotations ==
It is often useful to introduce one's own annotations, especially for libraries, and use these annotations to direct
the runtime to do different things. Many of the "built-in" features in Zest is actually done by this mechanism and
not directly implemented in the Core Runtime.

First create an annotation of your own liking, it must have +java.lang.annotation.Retention+ set to +RUNTIME+

[snippet,java]
-----------
source=core/runtime/src/test/java/org/qi4j/runtime/injection/InvocationInjectionTest.java
tag=annotation
-----------

After that it is possible to have this annotation placed on composite type methods,

[snippet,java]
-----------
source=core/runtime/src/test/java/org/qi4j/runtime/injection/InvocationInjectionTest.java
tag=declaration
-----------

and then the annotation can simply be injected into your Concerns or Mixins, like this;

[snippet,java]
-----------
source=core/runtime/src/test/java/org/qi4j/runtime/injection/InvocationInjectionTest.java
tag=use1
-----------

== java.util.Iterable<Method> ==
This injection will provide all the declared methods of the current composite. This is particularly useful for mixins
or concerns that builds information about the composite they belong to.