diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs
index 4bdbbe4..5f3b693 100755
--- a/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs
+++ b/mocha-dotnet/src/lib/Mocha.Core/KnownInstanceGuids.cs
@@ -186,6 +186,11 @@ namespace Mocha.Core
public static Guid GetAttributeBySystemRoutineMethod { get; } = new Guid("{9d45eb8c-1fb5-4260-a69c-f99a8f7a70b8}");
// GES - Get Element by System Routine Method - 67
// US - Update by System Routine Method - 68
+ ///
+ /// AA - Asssign Attribute Method - 73
+ ///
+ ///
+ public static Guid AssignAttributeMethod { get; } = new Guid("{3312A789-3B7A-4478-B329-4FF781504F9C}");
// CS - Compare Instance Sets Method - 91
public static Guid CalculateDateMethod { get; } = new Guid("{1e58e284-56eb-42b4-88b9-e0a691559fa6}"); // 92
// EC - Evaluate Conditions Method - 94
diff --git a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs
index e950e53..27acd2d 100755
--- a/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs
+++ b/mocha-dotnet/src/lib/Mocha.Core/KnownRelationshipGuids.cs
@@ -134,6 +134,11 @@ namespace Mocha.Core
public static Guid Evaluate_Boolean_Expression_Method__has_source_attribute__Method { get; } = new Guid("{45d76d56-01ed-4641-9f68-cfe0c7d0d265}");
public static Guid Evaluate_Boolean_Expression_Method__equal_to_attribute__Method { get; } = new Guid("{0646df91-7e3e-4d59-be71-b978a22ced8e}");
+ public static Guid Assign_Attribute_Method__uses__Executable_returning_Attribute { get; } = new Guid("{9313f96e-58af-416f-852e-ef83725057fc}");
+ public static Guid Executable_returning_Attribute__used_by__Assign_Attribute_Method { get; } = new Guid("{cd8fd04c-dcdd-4dc8-9d5c-e8f83d080cb8}");
+ public static Guid Assign_Attribute_Method__assigns__Attribute { get; } = new Guid("{74061875-8a27-403b-9456-02e52cfd13b2}");
+ public static Guid Attribute__assigned_by__Assign_Attribute_Method { get; } = new Guid("{d3b540e8-0f52-4595-bf52-1968637da59a}");
+
public static Guid Prompt_Value__has__Prompt { get; } = new Guid("{7CD62362-DDCE-4BFC-87B9-B5499B0BC141}");
public static Guid User__has_display_name__Translatable_Text_Constant { get; } = new Guid("{6C29856C-3B10-4F5B-A291-DD3CA4C04A2F}");
diff --git a/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs b/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs
new file mode 100644
index 0000000..a209350
--- /dev/null
+++ b/mocha-dotnet/src/lib/Mocha.Core/MethodImplementations/AssignAttributeMethodImplementation.cs
@@ -0,0 +1,26 @@
+namespace Mocha.Core.MethodImplementations;
+
+public class AssignAttributeMethodImplementation : MethodImplementation
+{
+ public override Guid MethodClassGuid => KnownInstanceGuids.MethodClasses.AssignAttributeMethod;
+ protected override InstanceHandle ExecuteInternal(Oms oms, OmsContext context, InstanceHandle method)
+ {
+ InstanceHandle irForClass = oms.GetRelatedInstance(method, oms.GetInstance(KnownRelationshipGuids.Method__for__Class));
+ InstanceHandle irForInstance = (InstanceHandle) context.GetWorkData(irForClass);
+
+ InstanceHandle assignsAttribute = oms.GetRelatedInstance(method, oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__assigns__Attribute));
+
+ if (assignsAttribute == InstanceHandle.Empty)
+ {
+ throw new InvalidOperationException("no assigns Attribute specified for method");
+ }
+
+ InstanceHandle assignsFrom = oms.GetRelatedInstance(method, oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__uses__Executable_returning_Attribute));
+ InstanceHandle assignsFromValue = oms.Execute(context, assignsFrom);
+
+ // InstanceHandle forInstance = (InstanceHandle) context.GetWorkData(irForClass);
+ object? value = context.GetWorkData(assignsFromValue);
+ oms.SetAttributeValue(irForInstance, assignsAttribute, value);
+ return InstanceHandle.Empty;
+ }
+}
\ No newline at end of file
diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs
index 6f5c061..034151e 100644
--- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs
+++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs
@@ -586,9 +586,9 @@ public abstract class Oms
implementation.Initialize(this);
}
- public InstanceHandle Execute(OmsContext context, Method method)
+ public InstanceHandle Execute(OmsContext context, Method method, InstanceHandle? targetInstance = null)
{
- return Execute(context, method.Handle);
+ return Execute(context, method.Handle, targetInstance);
}
public InstanceHandle Execute(OmsContext context, ReturnInstanceSetMethodBinding methodBinding)
{
@@ -608,7 +608,7 @@ public abstract class Oms
}
return defaultValue;
}
- private InstanceHandle Execute(OmsContext context, InstanceHandle methodOrMethodBinding)
+ public InstanceHandle Execute(OmsContext context, InstanceHandle methodOrMethodBinding, InstanceHandle? targetInstance = null)
{
InstanceHandle parentClass = GetParentClass(methodOrMethodBinding);
if (IsInstanceOf(methodOrMethodBinding, GetInstance(KnownInstanceGuids.Classes.ReturnAttributeMethodBinding))
@@ -620,6 +620,12 @@ public abstract class Oms
{
if (methodImplementations.ContainsKey(parentClass))
{
+ if (targetInstance != null)
+ {
+ InstanceHandle hh = targetInstance.GetValueOrDefault();
+ InstanceHandle pclassInstance = GetParentClass(hh);
+ context.SetWorkData(pclassInstance, hh);
+ }
return methodImplementations[parentClass].Execute(this, context, methodOrMethodBinding);
}
}
diff --git a/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs b/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs
index f69f72b..62d6ec8 100644
--- a/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs
+++ b/mocha-dotnet/src/lib/Mocha.Core/OmsImplementations/Mini/Modules/MethodsModule.cs
@@ -14,7 +14,7 @@ public class MethodsModule : MiniOmsModule
private InstanceHandle c_Method, c_MethodBinding;
private InstanceHandle a_Name, a_Order, a_Verb, a_Static;
private InstanceHandle c_ReturnAttributeMethodBinding, c_ReturnInstanceSetMethodBinding;
- private InstanceHandle c_BuildAttributeMethod, c_GetAttributeMethod, c_GetSpecifiedInstancesMethod, c_GetAttributeBySystemRoutineMethod;
+ private InstanceHandle c_BuildAttributeMethod, c_GetAttributeMethod, c_GetSpecifiedInstancesMethod, c_GetAttributeBySystemRoutineMethod, c_AssignAttributeMethod;
private InstanceHandle c_AccessModifier, i_AccessModifier_Private, i_AccessModifier_Protected, i_AccessModifier_Public, i_AccessModifier_RootA2;
private InstanceHandle c_SystemRoutine, c_SystemAttributeRoutine, c_SystemInstanceSetRoutine;
@@ -85,6 +85,11 @@ public class MethodsModule : MiniOmsModule
oms.CreateRelationship(c_GetAttributeBySystemRoutineMethod, "uses", c_Instance, KnownRelationshipGuids.Get_Attribute_by_System_Routine_Method__uses__System_Attribute_Routine, false, "used by", KnownRelationshipGuids.System_Attribute_Routine__used_by__Get_Attribute_by_System_Routine_Method);
oms.AddSuperClass(c_GetAttributeBySystemRoutineMethod, c_Method);
+ c_AssignAttributeMethod = oms.CreateClass("AA - Assign Attribute Method", KnownInstanceGuids.MethodClasses.AssignAttributeMethod);
+ oms.CreateRelationship(c_AssignAttributeMethod, "uses", c_Attribute, KnownRelationshipGuids.Assign_Attribute_Method__uses__Executable_returning_Attribute, true, "used by", KnownRelationshipGuids.Executable_returning_Attribute__used_by__Assign_Attribute_Method);
+ oms.CreateRelationship(c_AssignAttributeMethod, "assigns", c_Attribute, KnownRelationshipGuids.Assign_Attribute_Method__assigns__Attribute, false, "assigned by", KnownRelationshipGuids.Attribute__assigned_by__Assign_Attribute_Method);
+ oms.AddSuperClass(c_AssignAttributeMethod, c_Method);
+
oms.AddAttribute(c_Method, a_Name);
oms.AddAttribute(c_Method, a_Verb);
oms.AddAttribute(c_Method, a_Static);
diff --git a/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs b/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs
index 625d9ba..fb107ef 100644
--- a/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs
+++ b/mocha-dotnet/src/lib/Mocha.Core/OmsMethodBuilder.cs
@@ -86,4 +86,16 @@ public class OmsMethodBuilder
Oms.AssignRelationship(method, Oms.GetInstance(KnownRelationshipGuids.Get_Attribute_by_System_Routine_Method__uses__System_Attribute_Routine), usesSystemAttributeRoutine.Handle);
return new GetAttributeBySystemRoutineMethod(method);
}
+
+ public AssignAttributeMethod CreateAssignAttributeMethod(InstanceHandle forClassInstance, string verb, string name, AccessModifier accessModifier, bool isStatic, ReturnAttributeMethodBinding assignsFromExecutableReturningAttribute, InstanceHandle assignsToAttribute)
+ {
+ return CreateAssignAttributeMethod(forClassInstance, verb, name, accessModifier, isStatic, assignsFromExecutableReturningAttribute.Handle, assignsToAttribute);
+ }
+ public AssignAttributeMethod CreateAssignAttributeMethod(InstanceHandle forClassInstance, string verb, string name, AccessModifier accessModifier, bool isStatic, InstanceHandle assignsFromExecutableReturningAttribute, InstanceHandle assignsToAttribute)
+ {
+ InstanceHandle method = CreateMethodBase(Oms.GetInstance(KnownInstanceGuids.MethodClasses.AssignAttributeMethod), forClassInstance, verb, name, accessModifier, isStatic);
+ Oms.AssignRelationship(method, Oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__uses__Executable_returning_Attribute), assignsFromExecutableReturningAttribute);
+ Oms.AssignRelationship(method, Oms.GetInstance(KnownRelationshipGuids.Assign_Attribute_Method__assigns__Attribute), assignsToAttribute);
+ return new AssignAttributeMethod(method);
+ }
}
\ No newline at end of file
diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs b/mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs
new file mode 100644
index 0000000..bdf0832
--- /dev/null
+++ b/mocha-dotnet/src/lib/Mocha.Core/Oop/Methods/AssignAttributeMethod.cs
@@ -0,0 +1,8 @@
+
+namespace Mocha.Core.Oop;
+
+public class AssignAttributeMethod : Method
+{
+ public override Guid MethodClassGuid => KnownInstanceGuids.MethodClasses.AssignAttributeMethod;
+ public AssignAttributeMethod(InstanceHandle handle) : base(handle) { }
+}
\ No newline at end of file
diff --git a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs
index bd68798..7006355 100644
--- a/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs
+++ b/mocha-dotnet/tests/Mocha.Core.Tests/MethodTests.cs
@@ -1,4 +1,3 @@
-
using System.ComponentModel.DataAnnotations;
using Mocha.Core.OmsImplementations.Mini;
using Mocha.Core.Oop;
@@ -22,7 +21,7 @@ public class MethodTests : OmsTestsBase
OmsMethodBuilder builder = new OmsMethodBuilder(Oms);
- BuildAttributeMethod ih_BA = builder.CreateBuildAttributeMethod(irTestClass, "build", "Test Attribute", Oms.GetInstance(KnownInstanceGuids.AccessModifiers.Public), true, Oms.GetInstance(KnownAttributeGuids.Text.Name), test_value);
+ BuildAttributeMethod ih_BA = builder.CreateBuildAttributeMethod(irTestClass, "build", "Test Attribute", AccessModifier.Public, true, Oms.GetInstance(KnownAttributeGuids.Text.Name), test_value);
OmsContext context = Oms.CreateContext();
InstanceHandle ih_test = Oms.Execute(context, ih_BA);
@@ -152,4 +151,32 @@ public class MethodTests : OmsTestsBase
Assert.That((string)value, Is.EqualTo(Oms.RuntimeVersion.ToString()));
}
+ [Test]
+ public void AssignAttributeMethodTest()
+ {
+ InstanceHandle irTestClass = Oms.GetInstance(TEST_CLASS_GUID);
+ InstanceHandle irTestClassInstance = Oms.CreateInstanceOf(irTestClass);
+
+ InstanceHandle a_Name = Oms.GetInstance(KnownAttributeGuids.Text.Name);
+ Oms.AddAttribute(irTestClass, a_Name);
+
+ string test_value = "Jackdaws love my big sphinx of quartz.";
+
+ string value = Oms.GetAttributeValue(irTestClassInstance, a_Name);
+ Assert.That(value, Is.Not.EqualTo(test_value));
+
+ OmsMethodBuilder builder = new OmsMethodBuilder(Oms);
+
+ BuildAttributeMethod ih_BA = builder.CreateBuildAttributeMethod(irTestClass, "build", "Test Attribute", AccessModifier.Public, true, a_Name, test_value);
+ ReturnAttributeMethodBinding ramb1 = builder.CreateReturnAttributeMethodBinding(ih_BA);
+
+ AssignAttributeMethod ih_AA = builder.CreateAssignAttributeMethod(irTestClass, "set", "Test Attribute Value to `Jackdaws...`", AccessModifier.Public, true, ramb1, a_Name);
+
+ OmsContext context = Oms.CreateContext();
+ Oms.Execute(context, ih_AA, irTestClassInstance);
+
+ value = Oms.GetAttributeValue(irTestClassInstance, a_Name);
+ Assert.That(value, Is.EqualTo(test_value));
+ }
+
}
\ No newline at end of file