[[Property:title|Example: Self-initializing attributes and assigner commands]] [[Property:weight|0]] [[Property:uuid|dbc107a4-42cd-606a-71b2-e0b70ac5482e]] ==Description== Example of using a [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attribute]] and an [[ET: The Dynamic Structure: Execution Model#Assigner commands|assigner command]]. ==Notes== The concepts of [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attributes]] and [[ET: The Dynamic Structure: Execution Model#Assigner commands|assigner commands]] are independent of one another. However, this example shows how each works in a small amount of code. The example consists of two classes: a root class, and class PERSON. The PERSON class has a self-initializing attribute of type STRING named mood. If mood is accessed before it is explicitly initialized, then the self-initializing code after the keyword attribute will be executed, setting the default mood to "Happy". The attribute mood also has an assigner command, the procedure set_mood, designated as such by the assign keyword. This allows clients of class PERSON to appear to assign directly to mood. However, the assigner command set_mood will always get executed, and its precondition will be in force during such an apparent assignment. The root class APPLICATION creates an instance of PERSON and prints the value of mood, getting the self-iniitalized value. Then it assigns to mood. When it prints again, it gets the updated value. ==Source== Adapted from an example given on the Eiffel Software Users Group. ==Solution== A root class: class APPLICATION create make feature {NONE} -- Initialization make -- Print and set mood of `my_person'. do create my_person print ("Mood: " + my_person.mood + "%N") my_person.mood := "Ecstatic" print ("Mood: " + my_person.mood + "%N") end feature -- Access my_person: PERSON end Class PERSON: class PERSON feature -- Access mood: STRING assign set_mood attribute Result := "Happy" end feature -- Element change set_mood (a_string: STRING) require single_token: a_string.occurrences (' ') = 0 do mood := a_string ensure mood_set: mood = a_string end end ==Output== Mood: Happy Mood: Ecstatic