001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.annotation;
018
019import static java.lang.annotation.ElementType.*;
020import static java.lang.annotation.RetentionPolicy.*;
021
022import java.lang.annotation.*;
023
024/**
025 * Identifies a class as a builder for a POJO class.
026 *
027 * <h5 class='figure'>Example:</h5>
028 * <p class='bjava'>
029 *    <jc>// POJO class.</jc>
030 *    <ja>@Builder</ja>(MyBeanBuilder.<jk>class</jk>)
031 *    <jk>public class</jk> MyBean {
032 *
033 *       <jc>// Read-only properties.</jc>
034 *       <jk>public final</jk> String <jf>foo</jf>;
035 *       <jk>public final int</jk> <jf>bar</jf>;
036 *
037 *       <jc>// Constructor that takes in a builder.</jc>
038 *       <jk>public</jk> MyBean(MyBeanBuilder <jv>builder</jv>) {
039 *          <jk>this</jk>.<jf>foo</jf> = <jv>builder</jv>.<jf>foo</jf>;
040 *          <jk>this</jk>.<jf>bar</jf> = <jv>builder</jv>.<jf>bar</jf>;
041 *       }
042 *    }
043 *
044 *    <jc>// Builder class.</jc>
045 *    <jk>public class</jk> MyBeanBuilder {
046 *       <jk>public</jk> String <jf>foo</jf>;
047 *       <jk>public int</jk> <jf>bar</jf>;
048 *
049 *       <jc>// Method that creates the bean.</jc>
050 *       <jk>public</jk> MyBean build() {
051 *          <jk>return new</jk> MyBean(<jk>this</jk>);
052 *       }
053 *
054 *       <jc>// Bean property setters.</jc>
055 *    }
056 * </p>
057 *
058 * <h5 class='section'>See Also:</h5><ul>
059 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/PojoBuilders">POJO Builders</a>
060
061 * </ul>
062 */
063@Documented
064@Target({TYPE})
065@Retention(RUNTIME)
066@Inherited
067public @interface Builder {
068
069   /**
070    * The builder for this class.
071    *
072    * @return The annotation value.
073    */
074   Class<?> value() default void.class;
075}