[comment 
  Copyright (c) 2010 Atos Origin.
     
  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:
  Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net fix bug #515404 : Papyrus table generation
															   fix bug #506575 : add a getAppliedComments function
  Antonio Campesino Robles (Ericsson) - Bug 531275 
/]
[module papyrus('http://www.eclipse.org/gmf/runtime/1.0.2/notation','http://www.eclipse.org/uml2/4.0.0/UML','http://www.eclipse.org/gendoc/1.0/table')/]

[comment - get the diagrams of an object /]
[query public getPapyrusDiagrams(arg0 : ecore::EObject) : Sequence(Diagram)
	= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'getPapyrusDiagrams(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]

[comment - get the diagrams of an object /]
[query public getPapyrusOwnedDiagrams(arg0 : ecore::EObject) : Sequence(Diagram)
	= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'getPapyrusOwnedDiagrams(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]

[comment - get the documentation of an object /]	
[query public getDocumentation(arg0 : ecore::EObject) : String
	= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'getDocumentation(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]

[comment - get the documentation resources of an object /]
[query public getDocumentationResources(arg0 : ecore::EObject) : Sequence(String)
	= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'getDocumentationResources(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]

[query public replaceLinksByNameOrLabel(arg0 : String, arg1 : ecore::EObject) : String
	= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'replaceLinksByNameOrLabel(java.lang.String, org.eclipse.emf.ecore.EObject)', Sequence{arg0, arg1}) /]

[query public  getPapyrusTables (arg0 : ecore::EObject) : Sequence(table::Table)
= invoke('org.eclipse.gendoc.bundle.acceleo.papyrus.service.PapyrusServices', 'getPapyrusTables(org.eclipse.emf.ecore.EObject)', Sequence{arg0}) /]

[comment - get the applied comments/]
[query public getAppliedComment(element: Element) : Bag(String)
= element.ownedComment -> select(c:uml::Comment|(c.annotatedElement -> includes(element)))._body/]

[comment - virtual order methods must be implemented if the module is integrated to papyrus/]