package com.bd.movie.accessapi;

import com.bd.framework.accessapi.*;

import com.bd.framework.util.FactoryConfiguration;
import com.bd.framework.util.FactoryHelper;

import com.bd.movie.domain.Person;

/**
 <p>
 * Abstract Factory that creates concrete factory for Person Access objects. 
 * By default the factory implementation is 
 * com.bd.movie.accessimpl.PersonAccessFactoryImpl, 
 * but it can be changed by dependency injection of another FactoryConfiguration.
 </p>
 <p>
 * Abstract factory design pattern.
 </p>
 <!-- begin-user-doc -->
 <!-- end-user-doc -->
 *
 * @generated
 */
public abstract class PersonAccessFactory {
    /** @generated */
    private static  PersonAccessFactory singletonInstance;
    
    /**
     * By default com.bd.movie.accessimpl.PersonAccessFactoryImpl 
     * will be used as concrete factory.
     * @generated
     */
    private static FactoryConfiguration config = new FactoryConfiguration() {
        public String getFactoryImplementationClassName() {
            return "com.bd.movie.accessimpl.PersonAccessFactoryImpl";
        }
        
    };
    
    /**
     * Change configuration. Necessary for convenient unit testing.
     @param aConfig new configuration object
     * @generated
     */
    public static void setConfiguration(FactoryConfiguration aConfig) {
        config = aConfig;
    }
    
    /** @generated */
    public static PersonAccessFactory getInstance() {
        if (singletonInstance == null) {
            singletonInstance = createInstance();
        }
        return singletonInstance;
    }

    /** @generated */
    private static  PersonAccessFactory createInstance() {
        return (PersonAccessFactoryFactoryHelper.newInstanceFromName(
            config.getFactoryImplementationClassName());
    }
    
    /** @generated */
    protected Class getPersistentClass() {
        return Person.class;
    }

    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract FindByIdAccess<Person, String> createFindByIdAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract CreateAccess<Person> createCreateAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract UpdateAccess<Person> createUpdateAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract FindByQueryAccess<Person> createFindByQueryAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract FindByExampleAccess<Person> createFindByExampleAccess();
     
    /**
     <!-- begin-user-doc -->
     <!-- end-user-doc -->
     * @generated
     */
    public abstract DeleteAccess<Person> createDeleteAccess();