001/* 002 * Trident - A Multithreaded Server Alternative 003 * Copyright 2014 The TridentSDK Team 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * 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 net.tridentsdk.reflect; 018 019/** 020 * Produces an object for a particular injection class 021 * 022 * @author The TridentSDK Team 023 * @since 0.3-alpha-DP 024 */ 025@FunctionalInterface 026public interface Producer<T> { 027 /** 028 * Produces an empty inject object 029 * 030 * @return the produced object 031 */ 032 T produce(); 033 034 /** 035 * Produce an object for an {@link Inject#meta()} class provided by the annotation 036 * 037 * <p>This is for producing different implementations of the same superclass</p> 038 * 039 * <p>The best practice is throwing an {@link java.lang.IllegalArgumentException} if you do not have more than one 040 * implementation</p> 041 * 042 * @param metadata the provided class in the {@link Inject} annotation 043 * @return the produced object 044 */ 045 default T produce(Class<?> metadata) { 046 return produce(); 047 } 048}