sequenceDiagram
participant Element
participant Composition as Composition Module<br/>(method_missing)
participant OwnersChain as Owners Chain<br/>(Enumerator)
participant Subform
participant Form
participant Handler as Handler/HostObject
Note over Element,Handler: Phase 1: Ownership Establishment
Form->>Subform: new(owner: form)
Subform->>Subform: @owner = form
Subform->>Element: new(owner: subform)
Element->>Element: @owner = subform
Note over Element,Handler: Phase 2: Method Call with owner_ Prefix
Element->>Element: owner_name_render?
Element->>Composition: method_missing("owner_name_render?")
Note over Element,Handler: Phase 3: Method Name Processing
Composition->>Composition: name.start_with?("owner_") ✓
Composition->>Composition: owner_method = "name_render?"
Composition->>OwnersChain: owners_chain.detect { |o| o.respond_to?(owner_method) }
Note over Element,Handler: Phase 4: Chain Traversal
OwnersChain->>OwnersChain: Enumerator.new do |y|
OwnersChain->>Subform: obj = self.owner (subform)
OwnersChain->>Subform: respond_to?(:owner) → true
OwnersChain->>Subform: respond_to?("name_render?") → false
OwnersChain->>Form: obj = subform.owner (form)
OwnersChain->>Form: respond_to?(:owner) → true
OwnersChain->>Form: respond_to?("name_render?") → true ✓
OwnersChain-->>Composition: Found handler: form
Note over Element,Handler: Phase 5: Method Execution
Composition->>Form: public_send("name_render?", *args)
Form-->>Composition: result
Composition-->>Element: result
Note over Element,Handler: Alternative: Multi-Level Chain
Element->>Element: owner_shared_helper
Composition->>OwnersChain: owners_chain.detect
OwnersChain->>Subform: Check subform → false
OwnersChain->>Form: Check form → false
OwnersChain->>Handler: Check handler → true ✓
OwnersChain-->>Composition: Found: handler
Composition->>Handler: public_send("shared_helper")
Handler-->>Element: result
Created
December 31, 2025 07:39
-
-
Save andriy-baran/36991c0ea72ce9b557a04afb51b653e8 to your computer and use it in GitHub Desktop.
SteelWheel delegation diagram
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment