/*******************************************************************************
 *  Copyright (c) 2017 CEA LIST.
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  Contributors:
 *  		CEA LIST - Initial API and implementation
 *******************************************************************************/
/**
 */
package org.eclipse.papyrus.bmm.BMMProfile.impl;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.impl.EFactoryImpl;

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.papyrus.bmm.BMMProfile.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class BmmFactoryImpl extends EFactoryImpl implements BmmFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static BmmFactory init() {
		try {
			BmmFactory theBmmFactory = (BmmFactory)EPackage.Registry.INSTANCE.getEFactory(BmmPackage.eNS_URI);
			if (theBmmFactory != null) {
				return theBmmFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new BmmFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BmmFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case BmmPackage.ASSESSMENT: return createAssessment();
			case BmmPackage.ORGANIZATION_UNIT: return createOrganizationUnit();
			case BmmPackage.STRATEGY: return createStrategy();
			case BmmPackage.COURSE_OF_ACTION: return createCourseOfAction();
			case BmmPackage.MEANS: return createMeans();
			case BmmPackage.DIRECTIVE: return createDirective();
			case BmmPackage.POTENTIAL_IMPACT: return createPotentialImpact();
			case BmmPackage.REGULATION: return createRegulation();
			case BmmPackage.EXTERNAL_INFLUENCER: return createExternalInfluencer();
			case BmmPackage.INFLUENCER: return createInfluencer();
			case BmmPackage.INFLUENCING_ORGANIZATION: return createInfluencingOrganization();
			case BmmPackage.ORGANIZATION_CATEGORY: return createOrganizationCategory();
			case BmmPackage.INFLUENCER_CATEGORY: return createInfluencerCategory();
			case BmmPackage.DESIRED_RESULT: return createDesiredResult();
			case BmmPackage.END: return createEnd();
			case BmmPackage.DESIRED_RESULT_CATEGORY: return createDesiredResultCategory();
			case BmmPackage.ASSET: return createAsset();
			case BmmPackage.BUSINESS_PROCESS: return createBusinessProcess();
			case BmmPackage.BUSINESS_RULE: return createBusinessRule();
			case BmmPackage.BUSINESS_POLICY: return createBusinessPolicy();
			case BmmPackage.TACTIC: return createTactic();
			case BmmPackage.OFFERING: return createOffering();
			case BmmPackage.FIXED_ASSET: return createFixedAsset();
			case BmmPackage.RESOURCE: return createResource();
			case BmmPackage.LIABILITY: return createLiability();
			case BmmPackage.MISSION: return createMission();
			case BmmPackage.VISION: return createVision();
			case BmmPackage.GOAL: return createGoal();
			case BmmPackage.OBJECTIVE: return createObjective();
			case BmmPackage.ASSESSMENT_CATEGORY: return createAssessmentCategory();
			case BmmPackage.INTERNAL_INFLUENCER: return createInternalInfluencer();
			case BmmPackage.POTENTIAL_REWARD: return createPotentialReward();
			case BmmPackage.RISK: return createRisk();
			case BmmPackage.USING_ASSESSMENT_USES_USED_ASSESSMENT: return createUsingAssessmentUsesUsedAssessment();
			case BmmPackage.ORGANIZATION_UNIT_MAKES_ASSESSMENT: return createOrganizationUnitMakesAssessment();
			case BmmPackage.ASSESSMENT_CATEGORY_CATEGORIZES_ASSESSMENT: return createAssessmentCategoryCategorizesAssessment();
			case BmmPackage.ASSESSMENT_IDENTIFIES_POTENTIAL_IMPACT: return createAssessmentIdentifiesPotentialImpact();
			case BmmPackage.ASSESSMENT_AFFECTS_ACHIEVEMENT_OF_END: return createAssessmentAffectsAchievementOfEnd();
			case BmmPackage.ASSESSMENT_AFFECTS_EMPLOYMENT_OF_MEANS: return createAssessmentAffectsEmploymentOfMeans();
			case BmmPackage.ASSESSMENT_PROVIDES_IMPETUS_FOR_DIRECTIVE: return createAssessmentProvidesImpetusForDirective();
			case BmmPackage.ASSESSMENT_IS_JUDGMENT_OF_INFLUENCER: return createAssessmentIsJudgmentOfInfluencer();
			case BmmPackage.BROADER_ASSESSMENT_CATEGORY_CATEGORIZES_NARROWER_ASSESSMENT_CATEGORY: return createBroaderAssessmentCategoryCategorizesNarrowerAssessmentCategory();
			case BmmPackage.BUSINESS_PROCESS_MANAGES_ASSET: return createBusinessProcessManagesAsset();
			case BmmPackage.ORGANIZATION_UNIT_IS_RESPONSIBLE_FOR_ASSET: return createOrganizationUnitIsResponsibleForAsset();
			case BmmPackage.COURSE_OF_ACTION_DEPLOYS_ASSET: return createCourseOfActionDeploysAsset();
			case BmmPackage.DIRECTIVE_GOVERNS_USE_OF_ASSET: return createDirectiveGovernsUseOfAsset();
			case BmmPackage.BROADER_BUSINESS_POLICY_INCLUDES_MORE_SPECIFIC_BUSINESS_POLICY: return createBroaderBusinessPolicyIncludesMoreSpecificBusinessPolicy();
			case BmmPackage.BUSINESS_POLICY_IS_BASIS_OF_BUSINESS_RULE: return createBusinessPolicyIsBasisOfBusinessRule();
			case BmmPackage.BUSINESS_POLICY_GOVERNS_BUSINESS_PROCESS: return createBusinessPolicyGovernsBusinessProcess();
			case BmmPackage.ORGANIZATION_UNIT_IS_RESPONSIBLE_FOR_BUSINESS_PROCESS: return createOrganizationUnitIsResponsibleForBusinessProcess();
			case BmmPackage.BUSINESS_RULE_GUIDES_BUSINESS_PROCESS: return createBusinessRuleGuidesBusinessProcess();
			case BmmPackage.BUSINESS_PROCESS_REALIZES_COURSE_OF_ACTION: return createBusinessProcessRealizesCourseOfAction();
			case BmmPackage.BUSINESS_PROCESS_DELIVERS_OFFERING: return createBusinessProcessDeliversOffering();
			case BmmPackage.TACTIC_EFFECTS_ENFORCEMENT_LEVEL_OF_BUSINESS_RULE: return createTacticEffectsEnforcementLevelOfBusinessRule();
			case BmmPackage.DIRECTIVE_GOVERNS_COURSE_OF_ACTION: return createDirectiveGovernsCourseOfAction();
			case BmmPackage.BROADER_COURSE_OF_ACTION_INCLUDES_MORE_SPECIFIC_COURSE_OF_ACTION: return createBroaderCourseOfActionIncludesMoreSpecificCourseOfAction();
			case BmmPackage.ENABLING_COURSE_OF_ACTION_ENABLES_ENABLED_COURSE_OF_ACTION: return createEnablingCourseOfActionEnablesEnabledCourseOfAction();
			case BmmPackage.COURSE_OF_ACTION_IS_FORMULATED_BASED_ON_DIRECTIVE: return createCourseOfActionIsFormulatedBasedOnDirective();
			case BmmPackage.COURSE_OF_ACTION_DEFINES_OFFERING: return createCourseOfActionDefinesOffering();
			case BmmPackage.COURSE_OF_ACTION_DISCHARGES_LIABILITY: return createCourseOfActionDischargesLiability();
			case BmmPackage.COURSE_OF_ACTION_CHANNELS_EFFORTS_TOWARDS_DESIRED_RESULT: return createCourseOfActionChannelsEffortsTowardsDesiredResult();
			case BmmPackage.BROADER_DESIRED_RESULT_INCLUDES_MORE_SPECIFIC_DESIRED_RESULT: return createBroaderDesiredResultIncludesMoreSpecificDesiredResult();
			case BmmPackage.DESIRED_RESULT_CATEGORY_CATEGORIZES_DESIRED_RESULT: return createDesiredResultCategoryCategorizesDesiredResult();
			case BmmPackage.DIRECTIVE_SUPPORTS_ACHIEVEMENT_OF_DESIRED_RESULT: return createDirectiveSupportsAchievementOfDesiredResult();
			case BmmPackage.BROADER_DESIRED_CATEGORY_CATEGORIZES_MORE_SPECIFIC_DESIRED_RESULT_CATEGORY: return createBroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory();
			case BmmPackage.POTENTIAL_IMPACT_PROVIDES_IMPETURS_FOR_DIRECTIVE: return createPotentialImpactProvidesImpetursForDirective();
			case BmmPackage.DIRECTIVE_ACTS_AS_REGULATION: return createDirectiveActsAsRegulation();
			case BmmPackage.ORGANIZATION_UNIT_DEFINES_END: return createOrganizationUnitDefinesEnd();
			case BmmPackage.OFFERING_USES_FIXED_ASSET: return createOfferingUsesFixedAsset();
			case BmmPackage.FIXED_ASSET_PROVIDES_RESOURCE: return createFixedAssetProvidesResource();
			case BmmPackage.OBJECTIVE_QUANTITIES_GOAL: return createObjectiveQuantitiesGoal();
			case BmmPackage.GOAL_AMPLIFIES_VISION: return createGoalAmplifiesVision();
			case BmmPackage.ORGANIZATION_UNIT_RECOGNIZES_INFLUENCER: return createOrganizationUnitRecognizesInfluencer();
			case BmmPackage.INFLUENCING_ORGANIZATION_IS_SOURCEOF_INFLUENCER: return createInfluencingOrganizationIsSourceofInfluencer();
			case BmmPackage.INFLUENCER_CATEGORY_CATEGORIZES_INFLUENCER: return createInfluencerCategoryCategorizesInfluencer();
			case BmmPackage.BROADER_INFLUENCER_CATEGORIZES_NARROWER_INFLUENCER_CATEGORY: return createBroaderInfluencerCategorizesNarrowerInfluencerCategory();
			case BmmPackage.ORGANIZATION_CATEGORY_CATEGORIZES_INFLUENCING_ORGANIZATION: return createOrganizationCategoryCategorizesInfluencingOrganization();
			case BmmPackage.ORGANIZATION_UNIT_ACTS_AS_INFLUENCING_ORGANIZATION: return createOrganizationUnitActsAsInfluencingOrganization();
			case BmmPackage.ORGANIZATION_UNIT_IS_RESPONSIBLE_FOR_LIABILITY: return createOrganizationUnitIsResponsibleForLiability();
			case BmmPackage.LIABILITY_CLAIMS_RESOURCE: return createLiabilityClaimsResource();
			case BmmPackage.ORGANIZATION_UNIT_ESTABLISHES_MEANS: return createOrganizationUnitEstablishesMeans();
			case BmmPackage.STRATEGY_IS_ACOMPONENTF_OF_THE_PLAN_FOR_MISSION: return createStrategyIsAComponentfOfThe_PlanForMIssion();
			case BmmPackage.MISSION_MAKES_OPERATIVE_VISION: return createMissionMakesOperativeVision();
			case BmmPackage.OFFERING_REQUIRES_RESOURCE: return createOfferingRequiresResource();
			case BmmPackage.BROADER_ORGANIZATION_CATEGORY_CATEGORIZES_NARROWER_ORGANIZATION_CATEGORY: return createBroaderOrganizationCategoryCategorizesNarrowerOrganizationCategory();
			case BmmPackage.STRATEGY_DETERMINES_ORGANIZATION_UNIT: return createStrategyDeterminesOrganizationUnit();
			case BmmPackage.TACTIC_IMPLEMENTS_STRATEGY: return createTacticImplementsStrategy();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Assessment createAssessment() {
		AssessmentImpl assessment = new AssessmentImpl();
		return assessment;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnit createOrganizationUnit() {
		OrganizationUnitImpl organizationUnit = new OrganizationUnitImpl();
		return organizationUnit;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Strategy createStrategy() {
		StrategyImpl strategy = new StrategyImpl();
		return strategy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CourseOfAction createCourseOfAction() {
		CourseOfActionImpl courseOfAction = new CourseOfActionImpl();
		return courseOfAction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Means createMeans() {
		MeansImpl means = new MeansImpl();
		return means;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Directive createDirective() {
		DirectiveImpl directive = new DirectiveImpl();
		return directive;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PotentialImpact createPotentialImpact() {
		PotentialImpactImpl potentialImpact = new PotentialImpactImpl();
		return potentialImpact;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Regulation createRegulation() {
		RegulationImpl regulation = new RegulationImpl();
		return regulation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ExternalInfluencer createExternalInfluencer() {
		ExternalInfluencerImpl externalInfluencer = new ExternalInfluencerImpl();
		return externalInfluencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Influencer createInfluencer() {
		InfluencerImpl influencer = new InfluencerImpl();
		return influencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InfluencingOrganization createInfluencingOrganization() {
		InfluencingOrganizationImpl influencingOrganization = new InfluencingOrganizationImpl();
		return influencingOrganization;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationCategory createOrganizationCategory() {
		OrganizationCategoryImpl organizationCategory = new OrganizationCategoryImpl();
		return organizationCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InfluencerCategory createInfluencerCategory() {
		InfluencerCategoryImpl influencerCategory = new InfluencerCategoryImpl();
		return influencerCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DesiredResult createDesiredResult() {
		DesiredResultImpl desiredResult = new DesiredResultImpl();
		return desiredResult;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public End createEnd() {
		EndImpl end = new EndImpl();
		return end;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DesiredResultCategory createDesiredResultCategory() {
		DesiredResultCategoryImpl desiredResultCategory = new DesiredResultCategoryImpl();
		return desiredResultCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Asset createAsset() {
		AssetImpl asset = new AssetImpl();
		return asset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessProcess createBusinessProcess() {
		BusinessProcessImpl businessProcess = new BusinessProcessImpl();
		return businessProcess;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessRule createBusinessRule() {
		BusinessRuleImpl businessRule = new BusinessRuleImpl();
		return businessRule;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessPolicy createBusinessPolicy() {
		BusinessPolicyImpl businessPolicy = new BusinessPolicyImpl();
		return businessPolicy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Tactic createTactic() {
		TacticImpl tactic = new TacticImpl();
		return tactic;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Offering createOffering() {
		OfferingImpl offering = new OfferingImpl();
		return offering;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FixedAsset createFixedAsset() {
		FixedAssetImpl fixedAsset = new FixedAssetImpl();
		return fixedAsset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Resource createResource() {
		ResourceImpl resource = new ResourceImpl();
		return resource;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Liability createLiability() {
		LiabilityImpl liability = new LiabilityImpl();
		return liability;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Mission createMission() {
		MissionImpl mission = new MissionImpl();
		return mission;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Vision createVision() {
		VisionImpl vision = new VisionImpl();
		return vision;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Goal createGoal() {
		GoalImpl goal = new GoalImpl();
		return goal;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Objective createObjective() {
		ObjectiveImpl objective = new ObjectiveImpl();
		return objective;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentCategory createAssessmentCategory() {
		AssessmentCategoryImpl assessmentCategory = new AssessmentCategoryImpl();
		return assessmentCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InternalInfluencer createInternalInfluencer() {
		InternalInfluencerImpl internalInfluencer = new InternalInfluencerImpl();
		return internalInfluencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PotentialReward createPotentialReward() {
		PotentialRewardImpl potentialReward = new PotentialRewardImpl();
		return potentialReward;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Risk createRisk() {
		RiskImpl risk = new RiskImpl();
		return risk;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UsingAssessmentUsesUsedAssessment createUsingAssessmentUsesUsedAssessment() {
		UsingAssessmentUsesUsedAssessmentImpl usingAssessmentUsesUsedAssessment = new UsingAssessmentUsesUsedAssessmentImpl();
		return usingAssessmentUsesUsedAssessment;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitMakesAssessment createOrganizationUnitMakesAssessment() {
		OrganizationUnitMakesAssessmentImpl organizationUnitMakesAssessment = new OrganizationUnitMakesAssessmentImpl();
		return organizationUnitMakesAssessment;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentCategoryCategorizesAssessment createAssessmentCategoryCategorizesAssessment() {
		AssessmentCategoryCategorizesAssessmentImpl assessmentCategoryCategorizesAssessment = new AssessmentCategoryCategorizesAssessmentImpl();
		return assessmentCategoryCategorizesAssessment;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentIdentifiesPotentialImpact createAssessmentIdentifiesPotentialImpact() {
		AssessmentIdentifiesPotentialImpactImpl assessmentIdentifiesPotentialImpact = new AssessmentIdentifiesPotentialImpactImpl();
		return assessmentIdentifiesPotentialImpact;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentAffectsAchievementOfEnd createAssessmentAffectsAchievementOfEnd() {
		AssessmentAffectsAchievementOfEndImpl assessmentAffectsAchievementOfEnd = new AssessmentAffectsAchievementOfEndImpl();
		return assessmentAffectsAchievementOfEnd;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentAffectsEmploymentOfMeans createAssessmentAffectsEmploymentOfMeans() {
		AssessmentAffectsEmploymentOfMeansImpl assessmentAffectsEmploymentOfMeans = new AssessmentAffectsEmploymentOfMeansImpl();
		return assessmentAffectsEmploymentOfMeans;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentProvidesImpetusForDirective createAssessmentProvidesImpetusForDirective() {
		AssessmentProvidesImpetusForDirectiveImpl assessmentProvidesImpetusForDirective = new AssessmentProvidesImpetusForDirectiveImpl();
		return assessmentProvidesImpetusForDirective;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssessmentIsJudgmentOfInfluencer createAssessmentIsJudgmentOfInfluencer() {
		AssessmentIsJudgmentOfInfluencerImpl assessmentIsJudgmentOfInfluencer = new AssessmentIsJudgmentOfInfluencerImpl();
		return assessmentIsJudgmentOfInfluencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderAssessmentCategoryCategorizesNarrowerAssessmentCategory createBroaderAssessmentCategoryCategorizesNarrowerAssessmentCategory() {
		BroaderAssessmentCategoryCategorizesNarrowerAssessmentCategoryImpl broaderAssessmentCategoryCategorizesNarrowerAssessmentCategory = new BroaderAssessmentCategoryCategorizesNarrowerAssessmentCategoryImpl();
		return broaderAssessmentCategoryCategorizesNarrowerAssessmentCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessProcessManagesAsset createBusinessProcessManagesAsset() {
		BusinessProcessManagesAssetImpl businessProcessManagesAsset = new BusinessProcessManagesAssetImpl();
		return businessProcessManagesAsset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitIsResponsibleForAsset createOrganizationUnitIsResponsibleForAsset() {
		OrganizationUnitIsResponsibleForAssetImpl organizationUnitIsResponsibleForAsset = new OrganizationUnitIsResponsibleForAssetImpl();
		return organizationUnitIsResponsibleForAsset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CourseOfActionDeploysAsset createCourseOfActionDeploysAsset() {
		CourseOfActionDeploysAssetImpl courseOfActionDeploysAsset = new CourseOfActionDeploysAssetImpl();
		return courseOfActionDeploysAsset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DirectiveGovernsUseOfAsset createDirectiveGovernsUseOfAsset() {
		DirectiveGovernsUseOfAssetImpl directiveGovernsUseOfAsset = new DirectiveGovernsUseOfAssetImpl();
		return directiveGovernsUseOfAsset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderBusinessPolicyIncludesMoreSpecificBusinessPolicy createBroaderBusinessPolicyIncludesMoreSpecificBusinessPolicy() {
		BroaderBusinessPolicyIncludesMoreSpecificBusinessPolicyImpl broaderBusinessPolicyIncludesMoreSpecificBusinessPolicy = new BroaderBusinessPolicyIncludesMoreSpecificBusinessPolicyImpl();
		return broaderBusinessPolicyIncludesMoreSpecificBusinessPolicy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessPolicyIsBasisOfBusinessRule createBusinessPolicyIsBasisOfBusinessRule() {
		BusinessPolicyIsBasisOfBusinessRuleImpl businessPolicyIsBasisOfBusinessRule = new BusinessPolicyIsBasisOfBusinessRuleImpl();
		return businessPolicyIsBasisOfBusinessRule;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessPolicyGovernsBusinessProcess createBusinessPolicyGovernsBusinessProcess() {
		BusinessPolicyGovernsBusinessProcessImpl businessPolicyGovernsBusinessProcess = new BusinessPolicyGovernsBusinessProcessImpl();
		return businessPolicyGovernsBusinessProcess;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitIsResponsibleForBusinessProcess createOrganizationUnitIsResponsibleForBusinessProcess() {
		OrganizationUnitIsResponsibleForBusinessProcessImpl organizationUnitIsResponsibleForBusinessProcess = new OrganizationUnitIsResponsibleForBusinessProcessImpl();
		return organizationUnitIsResponsibleForBusinessProcess;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessRuleGuidesBusinessProcess createBusinessRuleGuidesBusinessProcess() {
		BusinessRuleGuidesBusinessProcessImpl businessRuleGuidesBusinessProcess = new BusinessRuleGuidesBusinessProcessImpl();
		return businessRuleGuidesBusinessProcess;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessProcessRealizesCourseOfAction createBusinessProcessRealizesCourseOfAction() {
		BusinessProcessRealizesCourseOfActionImpl businessProcessRealizesCourseOfAction = new BusinessProcessRealizesCourseOfActionImpl();
		return businessProcessRealizesCourseOfAction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BusinessProcessDeliversOffering createBusinessProcessDeliversOffering() {
		BusinessProcessDeliversOfferingImpl businessProcessDeliversOffering = new BusinessProcessDeliversOfferingImpl();
		return businessProcessDeliversOffering;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TacticEffectsEnforcementLevelOfBusinessRule createTacticEffectsEnforcementLevelOfBusinessRule() {
		TacticEffectsEnforcementLevelOfBusinessRuleImpl tacticEffectsEnforcementLevelOfBusinessRule = new TacticEffectsEnforcementLevelOfBusinessRuleImpl();
		return tacticEffectsEnforcementLevelOfBusinessRule;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DirectiveGovernsCourseOfAction createDirectiveGovernsCourseOfAction() {
		DirectiveGovernsCourseOfActionImpl directiveGovernsCourseOfAction = new DirectiveGovernsCourseOfActionImpl();
		return directiveGovernsCourseOfAction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderCourseOfActionIncludesMoreSpecificCourseOfAction createBroaderCourseOfActionIncludesMoreSpecificCourseOfAction() {
		BroaderCourseOfActionIncludesMoreSpecificCourseOfActionImpl broaderCourseOfActionIncludesMoreSpecificCourseOfAction = new BroaderCourseOfActionIncludesMoreSpecificCourseOfActionImpl();
		return broaderCourseOfActionIncludesMoreSpecificCourseOfAction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EnablingCourseOfActionEnablesEnabledCourseOfAction createEnablingCourseOfActionEnablesEnabledCourseOfAction() {
		EnablingCourseOfActionEnablesEnabledCourseOfActionImpl enablingCourseOfActionEnablesEnabledCourseOfAction = new EnablingCourseOfActionEnablesEnabledCourseOfActionImpl();
		return enablingCourseOfActionEnablesEnabledCourseOfAction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CourseOfActionIsFormulatedBasedOnDirective createCourseOfActionIsFormulatedBasedOnDirective() {
		CourseOfActionIsFormulatedBasedOnDirectiveImpl courseOfActionIsFormulatedBasedOnDirective = new CourseOfActionIsFormulatedBasedOnDirectiveImpl();
		return courseOfActionIsFormulatedBasedOnDirective;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CourseOfActionDefinesOffering createCourseOfActionDefinesOffering() {
		CourseOfActionDefinesOfferingImpl courseOfActionDefinesOffering = new CourseOfActionDefinesOfferingImpl();
		return courseOfActionDefinesOffering;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CourseOfActionDischargesLiability createCourseOfActionDischargesLiability() {
		CourseOfActionDischargesLiabilityImpl courseOfActionDischargesLiability = new CourseOfActionDischargesLiabilityImpl();
		return courseOfActionDischargesLiability;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CourseOfActionChannelsEffortsTowardsDesiredResult createCourseOfActionChannelsEffortsTowardsDesiredResult() {
		CourseOfActionChannelsEffortsTowardsDesiredResultImpl courseOfActionChannelsEffortsTowardsDesiredResult = new CourseOfActionChannelsEffortsTowardsDesiredResultImpl();
		return courseOfActionChannelsEffortsTowardsDesiredResult;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderDesiredResultIncludesMoreSpecificDesiredResult createBroaderDesiredResultIncludesMoreSpecificDesiredResult() {
		BroaderDesiredResultIncludesMoreSpecificDesiredResultImpl broaderDesiredResultIncludesMoreSpecificDesiredResult = new BroaderDesiredResultIncludesMoreSpecificDesiredResultImpl();
		return broaderDesiredResultIncludesMoreSpecificDesiredResult;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DesiredResultCategoryCategorizesDesiredResult createDesiredResultCategoryCategorizesDesiredResult() {
		DesiredResultCategoryCategorizesDesiredResultImpl desiredResultCategoryCategorizesDesiredResult = new DesiredResultCategoryCategorizesDesiredResultImpl();
		return desiredResultCategoryCategorizesDesiredResult;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DirectiveSupportsAchievementOfDesiredResult createDirectiveSupportsAchievementOfDesiredResult() {
		DirectiveSupportsAchievementOfDesiredResultImpl directiveSupportsAchievementOfDesiredResult = new DirectiveSupportsAchievementOfDesiredResultImpl();
		return directiveSupportsAchievementOfDesiredResult;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory createBroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory() {
		BroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategoryImpl broaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory = new BroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategoryImpl();
		return broaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PotentialImpactProvidesImpetursForDirective createPotentialImpactProvidesImpetursForDirective() {
		PotentialImpactProvidesImpetursForDirectiveImpl potentialImpactProvidesImpetursForDirective = new PotentialImpactProvidesImpetursForDirectiveImpl();
		return potentialImpactProvidesImpetursForDirective;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DirectiveActsAsRegulation createDirectiveActsAsRegulation() {
		DirectiveActsAsRegulationImpl directiveActsAsRegulation = new DirectiveActsAsRegulationImpl();
		return directiveActsAsRegulation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitDefinesEnd createOrganizationUnitDefinesEnd() {
		OrganizationUnitDefinesEndImpl organizationUnitDefinesEnd = new OrganizationUnitDefinesEndImpl();
		return organizationUnitDefinesEnd;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OfferingUsesFixedAsset createOfferingUsesFixedAsset() {
		OfferingUsesFixedAssetImpl offeringUsesFixedAsset = new OfferingUsesFixedAssetImpl();
		return offeringUsesFixedAsset;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FixedAssetProvidesResource createFixedAssetProvidesResource() {
		FixedAssetProvidesResourceImpl fixedAssetProvidesResource = new FixedAssetProvidesResourceImpl();
		return fixedAssetProvidesResource;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ObjectiveQuantitiesGoal createObjectiveQuantitiesGoal() {
		ObjectiveQuantitiesGoalImpl objectiveQuantitiesGoal = new ObjectiveQuantitiesGoalImpl();
		return objectiveQuantitiesGoal;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public GoalAmplifiesVision createGoalAmplifiesVision() {
		GoalAmplifiesVisionImpl goalAmplifiesVision = new GoalAmplifiesVisionImpl();
		return goalAmplifiesVision;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitRecognizesInfluencer createOrganizationUnitRecognizesInfluencer() {
		OrganizationUnitRecognizesInfluencerImpl organizationUnitRecognizesInfluencer = new OrganizationUnitRecognizesInfluencerImpl();
		return organizationUnitRecognizesInfluencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InfluencingOrganizationIsSourceofInfluencer createInfluencingOrganizationIsSourceofInfluencer() {
		InfluencingOrganizationIsSourceofInfluencerImpl influencingOrganizationIsSourceofInfluencer = new InfluencingOrganizationIsSourceofInfluencerImpl();
		return influencingOrganizationIsSourceofInfluencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InfluencerCategoryCategorizesInfluencer createInfluencerCategoryCategorizesInfluencer() {
		InfluencerCategoryCategorizesInfluencerImpl influencerCategoryCategorizesInfluencer = new InfluencerCategoryCategorizesInfluencerImpl();
		return influencerCategoryCategorizesInfluencer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderInfluencerCategorizesNarrowerInfluencerCategory createBroaderInfluencerCategorizesNarrowerInfluencerCategory() {
		BroaderInfluencerCategorizesNarrowerInfluencerCategoryImpl broaderInfluencerCategorizesNarrowerInfluencerCategory = new BroaderInfluencerCategorizesNarrowerInfluencerCategoryImpl();
		return broaderInfluencerCategorizesNarrowerInfluencerCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationCategoryCategorizesInfluencingOrganization createOrganizationCategoryCategorizesInfluencingOrganization() {
		OrganizationCategoryCategorizesInfluencingOrganizationImpl organizationCategoryCategorizesInfluencingOrganization = new OrganizationCategoryCategorizesInfluencingOrganizationImpl();
		return organizationCategoryCategorizesInfluencingOrganization;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitActsAsInfluencingOrganization createOrganizationUnitActsAsInfluencingOrganization() {
		OrganizationUnitActsAsInfluencingOrganizationImpl organizationUnitActsAsInfluencingOrganization = new OrganizationUnitActsAsInfluencingOrganizationImpl();
		return organizationUnitActsAsInfluencingOrganization;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitIsResponsibleForLiability createOrganizationUnitIsResponsibleForLiability() {
		OrganizationUnitIsResponsibleForLiabilityImpl organizationUnitIsResponsibleForLiability = new OrganizationUnitIsResponsibleForLiabilityImpl();
		return organizationUnitIsResponsibleForLiability;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LiabilityClaimsResource createLiabilityClaimsResource() {
		LiabilityClaimsResourceImpl liabilityClaimsResource = new LiabilityClaimsResourceImpl();
		return liabilityClaimsResource;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrganizationUnitEstablishesMeans createOrganizationUnitEstablishesMeans() {
		OrganizationUnitEstablishesMeansImpl organizationUnitEstablishesMeans = new OrganizationUnitEstablishesMeansImpl();
		return organizationUnitEstablishesMeans;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyIsAComponentfOfThe_PlanForMIssion createStrategyIsAComponentfOfThe_PlanForMIssion() {
		StrategyIsAComponentfOfThe_PlanForMIssionImpl strategyIsAComponentfOfThe_PlanForMIssion = new StrategyIsAComponentfOfThe_PlanForMIssionImpl();
		return strategyIsAComponentfOfThe_PlanForMIssion;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MissionMakesOperativeVision createMissionMakesOperativeVision() {
		MissionMakesOperativeVisionImpl missionMakesOperativeVision = new MissionMakesOperativeVisionImpl();
		return missionMakesOperativeVision;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OfferingRequiresResource createOfferingRequiresResource() {
		OfferingRequiresResourceImpl offeringRequiresResource = new OfferingRequiresResourceImpl();
		return offeringRequiresResource;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BroaderOrganizationCategoryCategorizesNarrowerOrganizationCategory createBroaderOrganizationCategoryCategorizesNarrowerOrganizationCategory() {
		BroaderOrganizationCategoryCategorizesNarrowerOrganizationCategoryImpl broaderOrganizationCategoryCategorizesNarrowerOrganizationCategory = new BroaderOrganizationCategoryCategorizesNarrowerOrganizationCategoryImpl();
		return broaderOrganizationCategoryCategorizesNarrowerOrganizationCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyDeterminesOrganizationUnit createStrategyDeterminesOrganizationUnit() {
		StrategyDeterminesOrganizationUnitImpl strategyDeterminesOrganizationUnit = new StrategyDeterminesOrganizationUnitImpl();
		return strategyDeterminesOrganizationUnit;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TacticImplementsStrategy createTacticImplementsStrategy() {
		TacticImplementsStrategyImpl tacticImplementsStrategy = new TacticImplementsStrategyImpl();
		return tacticImplementsStrategy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BmmPackage getBmmPackage() {
		return (BmmPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static BmmPackage getPackage() {
		return BmmPackage.eINSTANCE;
	}

} //BmmFactoryImpl
