// Get hold of the ActivityFunctions profile
// that contains the Function stereotype
var profile = ActivityFunctionsProfile!Profile.all.first();

// Get hold of the Function stereotype
var functionStereotype = profile.getPackagedElement("Function");

// Create a new plain UML Model element
var newModel : new UML!Model(name="NewModel");
// Apply the ActivityFunctions profile to it
newModel.applyProfile(profile);

// Create a new plain UML Activity element
var newActivity : new UML!Activity(name="NewActivity");
// ... add it as a child of the Model created above
newModel.packagedElement.add(newActivity);

// ... and apply the Function stereotype to it
var newFunction = newActivity.applyStereotype(functionStereotype);
// Set the value of the body property of the Function stereotype
newFunction.body = "return 42;";

// If we now try to query Function.all, the call will fail
// as the model is not aware of the Function type

// To remedy this we need to get hold of the EPackage 
// representation of the ActivityProfile
var profileEPackage = newModel.profileApplications.first().appliedDefinition;
// ... and add it to the package registry of our UML model
UML.resource.resourceSet.packageRegistry.put(profileEPackage.nsURI, profileEPackage);

// We can then use all the stereotypes in the profile
// as regular types
newFunction = UML!Function.all.first();
newFunction.body.println();

// The function and its underlying activity are still
// two separate elements in the model, linked via
// the function's base_Activity reference
newFunction.base_Activity.name.println();