require 'forwardable' Data = Struct.new(:name) class Role extend Forwardable def_delegators :@data, :name= def initialize data @data = data end def operation self.name = 'name' end end class Context def initialize role @role = role end def interaction @role.operation end end data = Data.new role = Role.new(data) context = Context.new(role) context.interaction