// Path: cdi-properties-main/src/main/java/com/byteslounge/cdi/resolver/context/ResolverContext.java
// public class ResolverContext {
// 
//     private final String key;
//     private final String bundleName;
//     private Bean<?> resolverBean;
//     private BeanManager beanManager;
// 
//     private ResolverContext(String key, String bundleName) {
//         this.key = key;
//         this.bundleName = bundleName;
//     }
// 
//     /**
//      * Creates a {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance.
//      * 
//      * @param key the property key to be associated with the created context
//      * @param bundleName the resource bundle name to be associated with the created context
//      * 
//      * @return the newly created {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      */
//     public static ResolverContext create(String key, String bundleName) {
//         return new ResolverContext(key, bundleName);
//     }
// 
//     /**
//      * Gets the key associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      * 
//      * @return the key associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      */
//     public String getKey() {
//         return key;
//     }
// 
//     /**
//      * Gets the resource bundle name associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      * 
//      * @return the resource bundle name associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      */
//     public String getBundleName() {
//         return bundleName;
//     }
// 
//     /**
//      * Sets the resolver bean associated with the current resolving execution
//      * 
//      * @param resolverBean the property key to be associated with the created context
//      */
//     public void setResolverBean(Bean<?> resolverBean) {
//         this.resolverBean = resolverBean;
//     }
// 
//     /**
//      * Gets the resolver bean associated with the current resolving execution
//      * 
//      * @return the resolver bean associated with the current resolving execution
//      */
//     public Bean<?> getResolverBean() {
//         return resolverBean;
//     }
// 
//     /**
//      * Gets the bean manager associated with the current resolving execution
//      * 
//      * @return the bean manager associated with the current resolving execution
//      */
//     public BeanManager getBeanManager() {
//         return beanManager;
//     }
// 
//     /**
//      * Sets the bean manager associated with the current resolving execution
//      * 
//      * @param beanManager the bean manager associated with the current resolving execution
//      */
//     public void setBeanManager(BeanManager beanManager) {
//         this.beanManager = beanManager;
//     }
// 
// }


import javax.enterprise.inject.spi.BeanManager;
import com.byteslounge.cdi.resolver.context.ResolverContext;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
/*
 * Copyright 2015 byteslounge.com (Gonçalo Marques).
 *
 * 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.
 */
package com.byteslounge.cdi.resolver.bean;



/**
 * Interface used to define an extension's resolver method.
 * 
 * @author Gonçalo Marques
 * @since 1.1.0
 */
public interface ResolverBean<T> {

    /**
     * Processes a CDI managed bean and checks if it defines an extension's resolver method
     * 
     * @param at the CDI managed bean to check for an extension's resolver method
     */
    void process(AnnotatedType<?> at);

    /**
     * Initializes the extension's resolver method
     * 
     * @param beanManager the CDI container Bean Manager
     */
    void initialize(BeanManager beanManager);
    
    /**
     * Invokes the extension's resolver method represented by this bean
     * 
     * @param resolverContext the Resolver Context
     * @param ctx The CDI creational context
     * 
     * @return the value returned by this extension's resolver method
     */
// Path: cdi-properties-main/src/main/java/com/byteslounge/cdi/resolver/context/ResolverContext.java
// public class ResolverContext {
// 
//     private final String key;
//     private final String bundleName;
//     private Bean<?> resolverBean;
//     private BeanManager beanManager;
// 
//     private ResolverContext(String key, String bundleName) {
//         this.key = key;
//         this.bundleName = bundleName;
//     }
// 
//     /**
//      * Creates a {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance.
//      * 
//      * @param key the property key to be associated with the created context
//      * @param bundleName the resource bundle name to be associated with the created context
//      * 
//      * @return the newly created {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      */
//     public static ResolverContext create(String key, String bundleName) {
//         return new ResolverContext(key, bundleName);
//     }
// 
//     /**
//      * Gets the key associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      * 
//      * @return the key associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      */
//     public String getKey() {
//         return key;
//     }
// 
//     /**
//      * Gets the resource bundle name associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      * 
//      * @return the resource bundle name associated with this {@link com.byteslounge.cdi.resolver.context.ResolverContext} instance
//      */
//     public String getBundleName() {
//         return bundleName;
//     }
// 
//     /**
//      * Sets the resolver bean associated with the current resolving execution
//      * 
//      * @param resolverBean the property key to be associated with the created context
//      */
//     public void setResolverBean(Bean<?> resolverBean) {
//         this.resolverBean = resolverBean;
//     }
// 
//     /**
//      * Gets the resolver bean associated with the current resolving execution
//      * 
//      * @return the resolver bean associated with the current resolving execution
//      */
//     public Bean<?> getResolverBean() {
//         return resolverBean;
//     }
// 
//     /**
//      * Gets the bean manager associated with the current resolving execution
//      * 
//      * @return the bean manager associated with the current resolving execution
//      */
//     public BeanManager getBeanManager() {
//         return beanManager;
//     }
// 
//     /**
//      * Sets the bean manager associated with the current resolving execution
//      * 
//      * @param beanManager the bean manager associated with the current resolving execution
//      */
//     public void setBeanManager(BeanManager beanManager) {
//         this.beanManager = beanManager;
//     }
// 
// }


// Path: cdi-properties-main/src/main/java/com/byteslounge/cdi/resolver/bean/ResolverBean.java
import javax.enterprise.inject.spi.BeanManager;
import com.byteslounge.cdi.resolver.context.ResolverContext;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;

/*
 * Copyright 2015 byteslounge.com (Gonçalo Marques).
 *
 * 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.
 */
package com.byteslounge.cdi.resolver.bean;



/**
 * Interface used to define an extension's resolver method.
 * 
 * @author Gonçalo Marques
 * @since 1.1.0
 */
public interface ResolverBean<T> {

    /**
     * Processes a CDI managed bean and checks if it defines an extension's resolver method
     * 
     * @param at the CDI managed bean to check for an extension's resolver method
     */
    void process(AnnotatedType<?> at);

    /**
     * Initializes the extension's resolver method
     * 
     * @param beanManager the CDI container Bean Manager
     */
    void initialize(BeanManager beanManager);
    
    /**
     * Invokes the extension's resolver method represented by this bean
     * 
     * @param resolverContext the Resolver Context
     * @param ctx The CDI creational context
     * 
     * @return the value returned by this extension's resolver method
     */
    T invoke(ResolverContext resolverContext, CreationalContext<?> ctx);