metaprogramming/advanced/method/delegation.rb

tests/_examples/metaprogramming/advanced/method/delegation.rb in the metorex repository.

# Method Delegation: Forward method calls to another object
# Demonstrates define_method and dynamic dispatch

class Logger
  def log(message)
    puts "[LOG] #{message}"
  end
end

class Service
  def initialize
    @logger = Logger.new
  end

  def process(data)
    @logger.log("Processing: #{data}")
    "processed: #{data}"
  end
end

# Simple delegation: Service delegates logging to Logger
puts "=== Simple Delegation ==="
service = Service.new
puts service.process("input data")

# Dynamic delegation using define_method
class Delegator
  def initialize(target)
    @target = target
  end

  def delegate(method_name)
    @target
  end
end

puts ""
puts "=== Dynamic Delegation ==="
logger = Logger.new
d = Delegator.new(logger)
target = d.delegate("log")
target.log("delegated message")

# Forwarding pattern: wrap calls with before/after hooks
class LoggingProxy
  def initialize(target)
    @target = target
  end

  def call(method_name, arg)
    puts "Before: #{method_name}"
    result = @target.process(arg)
    puts "After: #{method_name} -> #{result}"
    result
  end
end

puts ""
puts "=== Forwarding with Hooks ==="
proxy = LoggingProxy.new(Service.new)
proxy.call("process", "test data")

Output:

=== Simple Delegation ===
[LOG] Processing: input data
processed: input data

=== Dynamic Delegation ===
[LOG] delegated message

=== Forwarding with Hooks ===
Before: process
[LOG] Processing: test data
After: process -> processed: test data