001/*
002 *  Copyright 2013 Chris Pheby
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.jadira.reflection.cloning.annotation;
017
018import static java.lang.annotation.ElementType.CONSTRUCTOR;
019import static java.lang.annotation.ElementType.METHOD;
020import static java.lang.annotation.RetentionPolicy.RUNTIME;
021
022import java.lang.annotation.Documented;
023import java.lang.annotation.Retention;
024import java.lang.annotation.Target;
025
026/**
027 * This annotation can be applied to a method or constructor to indicate that it can be used to clone a particular type.
028 * A Constructor with this annotation must take a single argument that must be the same type or a supertype of the type
029 * to be cloned.
030 * <br>
031 * A Method with this annotation may be either a static method that returns an instance of the exact same type and takes 
032 * an instance of the same type or one of its supertypes as a parameter, or it may be an instance method that returns an
033 * instance of the same type and has no parameters. 
034 */
035@Retention(RUNTIME)
036@Target({ CONSTRUCTOR, METHOD })
037@Documented
038public @interface Cloner {
039}