/*******************************************************************************
 *  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;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.papyrus.bmm.BMMProfile.BmmPackage
 * @generated
 */
public interface BmmFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	BmmFactory eINSTANCE = org.eclipse.papyrus.bmm.BMMProfile.impl.BmmFactoryImpl.init();

	/**
	 * Returns a new object of class '<em>Assessment</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment</em>'.
	 * @generated
	 */
	Assessment createAssessment();

	/**
	 * Returns a new object of class '<em>Organization Unit</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit</em>'.
	 * @generated
	 */
	OrganizationUnit createOrganizationUnit();

	/**
	 * Returns a new object of class '<em>Strategy</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Strategy</em>'.
	 * @generated
	 */
	Strategy createStrategy();

	/**
	 * Returns a new object of class '<em>Course Of Action</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Course Of Action</em>'.
	 * @generated
	 */
	CourseOfAction createCourseOfAction();

	/**
	 * Returns a new object of class '<em>Means</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Means</em>'.
	 * @generated
	 */
	Means createMeans();

	/**
	 * Returns a new object of class '<em>Directive</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Directive</em>'.
	 * @generated
	 */
	Directive createDirective();

	/**
	 * Returns a new object of class '<em>Potential Impact</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Potential Impact</em>'.
	 * @generated
	 */
	PotentialImpact createPotentialImpact();

	/**
	 * Returns a new object of class '<em>Regulation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Regulation</em>'.
	 * @generated
	 */
	Regulation createRegulation();

	/**
	 * Returns a new object of class '<em>External Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>External Influencer</em>'.
	 * @generated
	 */
	ExternalInfluencer createExternalInfluencer();

	/**
	 * Returns a new object of class '<em>Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Influencer</em>'.
	 * @generated
	 */
	Influencer createInfluencer();

	/**
	 * Returns a new object of class '<em>Influencing Organization</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Influencing Organization</em>'.
	 * @generated
	 */
	InfluencingOrganization createInfluencingOrganization();

	/**
	 * Returns a new object of class '<em>Organization Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Category</em>'.
	 * @generated
	 */
	OrganizationCategory createOrganizationCategory();

	/**
	 * Returns a new object of class '<em>Influencer Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Influencer Category</em>'.
	 * @generated
	 */
	InfluencerCategory createInfluencerCategory();

	/**
	 * Returns a new object of class '<em>Desired Result</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Desired Result</em>'.
	 * @generated
	 */
	DesiredResult createDesiredResult();

	/**
	 * Returns a new object of class '<em>End</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>End</em>'.
	 * @generated
	 */
	End createEnd();

	/**
	 * Returns a new object of class '<em>Desired Result Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Desired Result Category</em>'.
	 * @generated
	 */
	DesiredResultCategory createDesiredResultCategory();

	/**
	 * Returns a new object of class '<em>Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Asset</em>'.
	 * @generated
	 */
	Asset createAsset();

	/**
	 * Returns a new object of class '<em>Business Process</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Process</em>'.
	 * @generated
	 */
	BusinessProcess createBusinessProcess();

	/**
	 * Returns a new object of class '<em>Business Rule</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Rule</em>'.
	 * @generated
	 */
	BusinessRule createBusinessRule();

	/**
	 * Returns a new object of class '<em>Business Policy</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Policy</em>'.
	 * @generated
	 */
	BusinessPolicy createBusinessPolicy();

	/**
	 * Returns a new object of class '<em>Tactic</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Tactic</em>'.
	 * @generated
	 */
	Tactic createTactic();

	/**
	 * Returns a new object of class '<em>Offering</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Offering</em>'.
	 * @generated
	 */
	Offering createOffering();

	/**
	 * Returns a new object of class '<em>Fixed Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Fixed Asset</em>'.
	 * @generated
	 */
	FixedAsset createFixedAsset();

	/**
	 * Returns a new object of class '<em>Resource</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Resource</em>'.
	 * @generated
	 */
	Resource createResource();

	/**
	 * Returns a new object of class '<em>Liability</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Liability</em>'.
	 * @generated
	 */
	Liability createLiability();

	/**
	 * Returns a new object of class '<em>Mission</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Mission</em>'.
	 * @generated
	 */
	Mission createMission();

	/**
	 * Returns a new object of class '<em>Vision</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Vision</em>'.
	 * @generated
	 */
	Vision createVision();

	/**
	 * Returns a new object of class '<em>Goal</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Goal</em>'.
	 * @generated
	 */
	Goal createGoal();

	/**
	 * Returns a new object of class '<em>Objective</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Objective</em>'.
	 * @generated
	 */
	Objective createObjective();

	/**
	 * Returns a new object of class '<em>Assessment Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Category</em>'.
	 * @generated
	 */
	AssessmentCategory createAssessmentCategory();

	/**
	 * Returns a new object of class '<em>Internal Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Internal Influencer</em>'.
	 * @generated
	 */
	InternalInfluencer createInternalInfluencer();

	/**
	 * Returns a new object of class '<em>Potential Reward</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Potential Reward</em>'.
	 * @generated
	 */
	PotentialReward createPotentialReward();

	/**
	 * Returns a new object of class '<em>Risk</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Risk</em>'.
	 * @generated
	 */
	Risk createRisk();

	/**
	 * Returns a new object of class '<em>Using Assessment Uses Used Assessment</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Using Assessment Uses Used Assessment</em>'.
	 * @generated
	 */
	UsingAssessmentUsesUsedAssessment createUsingAssessmentUsesUsedAssessment();

	/**
	 * Returns a new object of class '<em>Organization Unit Makes Assessment</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Makes Assessment</em>'.
	 * @generated
	 */
	OrganizationUnitMakesAssessment createOrganizationUnitMakesAssessment();

	/**
	 * Returns a new object of class '<em>Assessment Category Categorizes Assessment</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Category Categorizes Assessment</em>'.
	 * @generated
	 */
	AssessmentCategoryCategorizesAssessment createAssessmentCategoryCategorizesAssessment();

	/**
	 * Returns a new object of class '<em>Assessment Identifies Potential Impact</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Identifies Potential Impact</em>'.
	 * @generated
	 */
	AssessmentIdentifiesPotentialImpact createAssessmentIdentifiesPotentialImpact();

	/**
	 * Returns a new object of class '<em>Assessment Affects Achievement Of End</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Affects Achievement Of End</em>'.
	 * @generated
	 */
	AssessmentAffectsAchievementOfEnd createAssessmentAffectsAchievementOfEnd();

	/**
	 * Returns a new object of class '<em>Assessment Affects Employment Of Means</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Affects Employment Of Means</em>'.
	 * @generated
	 */
	AssessmentAffectsEmploymentOfMeans createAssessmentAffectsEmploymentOfMeans();

	/**
	 * Returns a new object of class '<em>Assessment Provides Impetus For Directive</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Provides Impetus For Directive</em>'.
	 * @generated
	 */
	AssessmentProvidesImpetusForDirective createAssessmentProvidesImpetusForDirective();

	/**
	 * Returns a new object of class '<em>Assessment Is Judgment Of Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Assessment Is Judgment Of Influencer</em>'.
	 * @generated
	 */
	AssessmentIsJudgmentOfInfluencer createAssessmentIsJudgmentOfInfluencer();

	/**
	 * Returns a new object of class '<em>Broader Assessment Category Categorizes Narrower Assessment Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Assessment Category Categorizes Narrower Assessment Category</em>'.
	 * @generated
	 */
	BroaderAssessmentCategoryCategorizesNarrowerAssessmentCategory createBroaderAssessmentCategoryCategorizesNarrowerAssessmentCategory();

	/**
	 * Returns a new object of class '<em>Business Process Manages Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Process Manages Asset</em>'.
	 * @generated
	 */
	BusinessProcessManagesAsset createBusinessProcessManagesAsset();

	/**
	 * Returns a new object of class '<em>Organization Unit Is Responsible For Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Is Responsible For Asset</em>'.
	 * @generated
	 */
	OrganizationUnitIsResponsibleForAsset createOrganizationUnitIsResponsibleForAsset();

	/**
	 * Returns a new object of class '<em>Course Of Action Deploys Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Course Of Action Deploys Asset</em>'.
	 * @generated
	 */
	CourseOfActionDeploysAsset createCourseOfActionDeploysAsset();

	/**
	 * Returns a new object of class '<em>Directive Governs Use Of Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Directive Governs Use Of Asset</em>'.
	 * @generated
	 */
	DirectiveGovernsUseOfAsset createDirectiveGovernsUseOfAsset();

	/**
	 * Returns a new object of class '<em>Broader Business Policy Includes More Specific Business Policy</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Business Policy Includes More Specific Business Policy</em>'.
	 * @generated
	 */
	BroaderBusinessPolicyIncludesMoreSpecificBusinessPolicy createBroaderBusinessPolicyIncludesMoreSpecificBusinessPolicy();

	/**
	 * Returns a new object of class '<em>Business Policy Is Basis Of Business Rule</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Policy Is Basis Of Business Rule</em>'.
	 * @generated
	 */
	BusinessPolicyIsBasisOfBusinessRule createBusinessPolicyIsBasisOfBusinessRule();

	/**
	 * Returns a new object of class '<em>Business Policy Governs Business Process</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Policy Governs Business Process</em>'.
	 * @generated
	 */
	BusinessPolicyGovernsBusinessProcess createBusinessPolicyGovernsBusinessProcess();

	/**
	 * Returns a new object of class '<em>Organization Unit Is Responsible For Business Process</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Is Responsible For Business Process</em>'.
	 * @generated
	 */
	OrganizationUnitIsResponsibleForBusinessProcess createOrganizationUnitIsResponsibleForBusinessProcess();

	/**
	 * Returns a new object of class '<em>Business Rule Guides Business Process</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Rule Guides Business Process</em>'.
	 * @generated
	 */
	BusinessRuleGuidesBusinessProcess createBusinessRuleGuidesBusinessProcess();

	/**
	 * Returns a new object of class '<em>Business Process Realizes Course Of Action</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Process Realizes Course Of Action</em>'.
	 * @generated
	 */
	BusinessProcessRealizesCourseOfAction createBusinessProcessRealizesCourseOfAction();

	/**
	 * Returns a new object of class '<em>Business Process Delivers Offering</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Business Process Delivers Offering</em>'.
	 * @generated
	 */
	BusinessProcessDeliversOffering createBusinessProcessDeliversOffering();

	/**
	 * Returns a new object of class '<em>Tactic Effects Enforcement Level Of Business Rule</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Tactic Effects Enforcement Level Of Business Rule</em>'.
	 * @generated
	 */
	TacticEffectsEnforcementLevelOfBusinessRule createTacticEffectsEnforcementLevelOfBusinessRule();

	/**
	 * Returns a new object of class '<em>Directive Governs Course Of Action</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Directive Governs Course Of Action</em>'.
	 * @generated
	 */
	DirectiveGovernsCourseOfAction createDirectiveGovernsCourseOfAction();

	/**
	 * Returns a new object of class '<em>Broader Course Of Action Includes More Specific Course Of Action</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Course Of Action Includes More Specific Course Of Action</em>'.
	 * @generated
	 */
	BroaderCourseOfActionIncludesMoreSpecificCourseOfAction createBroaderCourseOfActionIncludesMoreSpecificCourseOfAction();

	/**
	 * Returns a new object of class '<em>Enabling Course Of Action Enables Enabled Course Of Action</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Enabling Course Of Action Enables Enabled Course Of Action</em>'.
	 * @generated
	 */
	EnablingCourseOfActionEnablesEnabledCourseOfAction createEnablingCourseOfActionEnablesEnabledCourseOfAction();

	/**
	 * Returns a new object of class '<em>Course Of Action Is Formulated Based On Directive</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Course Of Action Is Formulated Based On Directive</em>'.
	 * @generated
	 */
	CourseOfActionIsFormulatedBasedOnDirective createCourseOfActionIsFormulatedBasedOnDirective();

	/**
	 * Returns a new object of class '<em>Course Of Action Defines Offering</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Course Of Action Defines Offering</em>'.
	 * @generated
	 */
	CourseOfActionDefinesOffering createCourseOfActionDefinesOffering();

	/**
	 * Returns a new object of class '<em>Course Of Action Discharges Liability</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Course Of Action Discharges Liability</em>'.
	 * @generated
	 */
	CourseOfActionDischargesLiability createCourseOfActionDischargesLiability();

	/**
	 * Returns a new object of class '<em>Course Of Action Channels Efforts Towards Desired Result</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Course Of Action Channels Efforts Towards Desired Result</em>'.
	 * @generated
	 */
	CourseOfActionChannelsEffortsTowardsDesiredResult createCourseOfActionChannelsEffortsTowardsDesiredResult();

	/**
	 * Returns a new object of class '<em>Broader Desired Result Includes More Specific Desired Result</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Desired Result Includes More Specific Desired Result</em>'.
	 * @generated
	 */
	BroaderDesiredResultIncludesMoreSpecificDesiredResult createBroaderDesiredResultIncludesMoreSpecificDesiredResult();

	/**
	 * Returns a new object of class '<em>Desired Result Category Categorizes Desired Result</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Desired Result Category Categorizes Desired Result</em>'.
	 * @generated
	 */
	DesiredResultCategoryCategorizesDesiredResult createDesiredResultCategoryCategorizesDesiredResult();

	/**
	 * Returns a new object of class '<em>Directive Supports Achievement Of Desired Result</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Directive Supports Achievement Of Desired Result</em>'.
	 * @generated
	 */
	DirectiveSupportsAchievementOfDesiredResult createDirectiveSupportsAchievementOfDesiredResult();

	/**
	 * Returns a new object of class '<em>Broader Desired Category Categorizes More Specific Desired Result Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Desired Category Categorizes More Specific Desired Result Category</em>'.
	 * @generated
	 */
	BroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory createBroaderDesiredCategoryCategorizesMoreSpecificDesiredResultCategory();

	/**
	 * Returns a new object of class '<em>Potential Impact Provides Impeturs For Directive</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Potential Impact Provides Impeturs For Directive</em>'.
	 * @generated
	 */
	PotentialImpactProvidesImpetursForDirective createPotentialImpactProvidesImpetursForDirective();

	/**
	 * Returns a new object of class '<em>Directive Acts As Regulation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Directive Acts As Regulation</em>'.
	 * @generated
	 */
	DirectiveActsAsRegulation createDirectiveActsAsRegulation();

	/**
	 * Returns a new object of class '<em>Organization Unit Defines End</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Defines End</em>'.
	 * @generated
	 */
	OrganizationUnitDefinesEnd createOrganizationUnitDefinesEnd();

	/**
	 * Returns a new object of class '<em>Offering Uses Fixed Asset</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Offering Uses Fixed Asset</em>'.
	 * @generated
	 */
	OfferingUsesFixedAsset createOfferingUsesFixedAsset();

	/**
	 * Returns a new object of class '<em>Fixed Asset Provides Resource</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Fixed Asset Provides Resource</em>'.
	 * @generated
	 */
	FixedAssetProvidesResource createFixedAssetProvidesResource();

	/**
	 * Returns a new object of class '<em>Objective Quantities Goal</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Objective Quantities Goal</em>'.
	 * @generated
	 */
	ObjectiveQuantitiesGoal createObjectiveQuantitiesGoal();

	/**
	 * Returns a new object of class '<em>Goal Amplifies Vision</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Goal Amplifies Vision</em>'.
	 * @generated
	 */
	GoalAmplifiesVision createGoalAmplifiesVision();

	/**
	 * Returns a new object of class '<em>Organization Unit Recognizes Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Recognizes Influencer</em>'.
	 * @generated
	 */
	OrganizationUnitRecognizesInfluencer createOrganizationUnitRecognizesInfluencer();

	/**
	 * Returns a new object of class '<em>Influencing Organization Is Sourceof Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Influencing Organization Is Sourceof Influencer</em>'.
	 * @generated
	 */
	InfluencingOrganizationIsSourceofInfluencer createInfluencingOrganizationIsSourceofInfluencer();

	/**
	 * Returns a new object of class '<em>Influencer Category Categorizes Influencer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Influencer Category Categorizes Influencer</em>'.
	 * @generated
	 */
	InfluencerCategoryCategorizesInfluencer createInfluencerCategoryCategorizesInfluencer();

	/**
	 * Returns a new object of class '<em>Broader Influencer Categorizes Narrower Influencer Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Influencer Categorizes Narrower Influencer Category</em>'.
	 * @generated
	 */
	BroaderInfluencerCategorizesNarrowerInfluencerCategory createBroaderInfluencerCategorizesNarrowerInfluencerCategory();

	/**
	 * Returns a new object of class '<em>Organization Category Categorizes Influencing Organization</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Category Categorizes Influencing Organization</em>'.
	 * @generated
	 */
	OrganizationCategoryCategorizesInfluencingOrganization createOrganizationCategoryCategorizesInfluencingOrganization();

	/**
	 * Returns a new object of class '<em>Organization Unit Acts As Influencing Organization</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Acts As Influencing Organization</em>'.
	 * @generated
	 */
	OrganizationUnitActsAsInfluencingOrganization createOrganizationUnitActsAsInfluencingOrganization();

	/**
	 * Returns a new object of class '<em>Organization Unit Is Responsible For Liability</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Is Responsible For Liability</em>'.
	 * @generated
	 */
	OrganizationUnitIsResponsibleForLiability createOrganizationUnitIsResponsibleForLiability();

	/**
	 * Returns a new object of class '<em>Liability Claims Resource</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Liability Claims Resource</em>'.
	 * @generated
	 */
	LiabilityClaimsResource createLiabilityClaimsResource();

	/**
	 * Returns a new object of class '<em>Organization Unit Establishes Means</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Organization Unit Establishes Means</em>'.
	 * @generated
	 */
	OrganizationUnitEstablishesMeans createOrganizationUnitEstablishesMeans();

	/**
	 * Returns a new object of class '<em>Strategy Is AComponentf Of The Plan For MIssion</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Strategy Is AComponentf Of The Plan For MIssion</em>'.
	 * @generated
	 */
	StrategyIsAComponentfOfThe_PlanForMIssion createStrategyIsAComponentfOfThe_PlanForMIssion();

	/**
	 * Returns a new object of class '<em>Mission Makes Operative Vision</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Mission Makes Operative Vision</em>'.
	 * @generated
	 */
	MissionMakesOperativeVision createMissionMakesOperativeVision();

	/**
	 * Returns a new object of class '<em>Offering Requires Resource</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Offering Requires Resource</em>'.
	 * @generated
	 */
	OfferingRequiresResource createOfferingRequiresResource();

	/**
	 * Returns a new object of class '<em>Broader Organization Category Categorizes Narrower Organization Category</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Broader Organization Category Categorizes Narrower Organization Category</em>'.
	 * @generated
	 */
	BroaderOrganizationCategoryCategorizesNarrowerOrganizationCategory createBroaderOrganizationCategoryCategorizesNarrowerOrganizationCategory();

	/**
	 * Returns a new object of class '<em>Strategy Determines Organization Unit</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Strategy Determines Organization Unit</em>'.
	 * @generated
	 */
	StrategyDeterminesOrganizationUnit createStrategyDeterminesOrganizationUnit();

	/**
	 * Returns a new object of class '<em>Tactic Implements Strategy</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Tactic Implements Strategy</em>'.
	 * @generated
	 */
	TacticImplementsStrategy createTacticImplementsStrategy();

	/**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	BmmPackage getBmmPackage();

} //BmmFactory
