Module: Rubyverse

Defined in:
lib/rubyverse.rb

Overview

Parallel Ruby universes (“Rubyverses”) - A proposed interface for parallel, “semi-private” method or method-and-data spaces via “closely associated” objects.

Example:

require 'rubyverse'

class Number_Assistant
    def initialize (original); @original = original; end
    def my_method; "Number assistant for #{@original}"; end
    def rubyverse_original; @original; end
end

class String_Assistant
    def initialize (original); @original = original; end
    def my_method; "String assistant for #{@original}"; end
    def rubyverse_original; @original; end
end

class Assisted
    include Rubyverse
    def rubyverse_new (object)
        case object
        when Numeric then Number_Assistant.new(object)
        when String then String_Assistant.new(object)
        else self
        end
    end
    def my_method; "Default assistant"; end
end

object = Assisted.new

object.rubyversed(10).my_method      # "Number assistant for 10"
10.in_rubyverse(object).my_method    # "Number assistant for 10"

object.rubyversed("hi").my_method    # "String assistant for hi"
"hi".in_rubyverse(object).my_method  # "String assistant for hi"

object.rubyversed(nil).my_method     # "Default assistant"
nil.in_rubyverse(object).my_method   # "Default assistant"

The Rubyverse module provides a reference implementation that may be used to extend objects that will be Rubyverses. The Object class is extended with supporting methods.

A Rubyverse object is responsible for allocating and maintaining a map of appropriate parallel objects for its Rubyverse.

Author:

Version:

  • 1.0.0

License:

  • Public Domain

Constant Summary collapse

VERSION =
"1.0.0"

Instance Method Summary collapse

Instance Method Details

#rubyverse_map(create = true) ⇒ Hash

Return the map of original-to-#rubyversed objects.

Parameters:

  • create (Boolean) (defaults to: true)

    Whether to create the map if it doesn’t exist yet.

Returns:

  • (Hash)


78
79
80
81
82
# File 'lib/rubyverse.rb', line 78

def rubyverse_map (create = true)
	if create then @rubyverse_map ||= {}.compare_by_identity
	else @rubyverse_map
	end
end

#rubyverse_new(original) ⇒ Object

This method is abstract.

You MUST supply your own implementation.

Return a parallel object in this Rubyverse corresponding to the given original object.

It is invoked by Object#in_rubyverse(rubyverse) upon the first reference to each Rubyverse for each original object.

It is recommended that parallel objects be initialized with the original object and that they override #rubyverse_original to return it.

Parameters:

  • original

    The original object.



70
# File 'lib/rubyverse.rb', line 70

def rubyverse_new (original); end

#rubyversed(object) ⇒ Object

Return an object’s parallel object in this Rubyverse.

Required by Object#in_rubyverse.

Parameters:

  • object

    The original object.



89
90
91
# File 'lib/rubyverse.rb', line 89

def rubyversed (object)
	self.rubyverse_map[object] ||= rubyverse_new object
end