rubyx/lib/parfait/singleton_class.rb

72 lines
2.0 KiB
Ruby
Raw Normal View History

#
# In many respects a SingletonClass is like a Class. We haven't gone to the full ruby/oo level
# yet, where the singleton_class is actually a class instance, but someday.
# A Class in general can be viewed as a way to generate methods for a group of objects.
# A SingletonClass serves the same function, but just for one object, the class object that it
# is the singleton_class of.
# This is slightly different in the way that the type of the class must actually
# change, whereas for a class the instance type changes and only objects generated
# henceafter have a different type.
# Another current difference is that a singleton_class has no superclass. Also no name.
# There is a one to one relationship between a class instance and it's singleton_class instance.
module Parfait
class SingletonClass < Behaviour
attr_reader :clazz
def self.type_length
4
end
2019-09-09 23:18:20 +02:00
def self.memory_size
8
end
def initialize( clazz )
clazz_hash = clazz.type.to_hash
@clazz = clazz
super( Type.for_hash(clazz_hash , self , 1) )
@clazz.set_type( @instance_type )
end
def rxf_reference_name
@clazz.name
end
def name
:"#{clazz.name}.Single"
end
def inspect
"SingletonClass(#{@clazz.name})"
end
2019-09-21 17:07:58 +02:00
def to_s
inspect
end
# adding an instance changes the instance_type to include that variable
def add_instance_variable( name , type)
super(name,type)
@clazz.set_type(@instance_type)
end
# the super class of a singleton classs is the singleton class of the super class.
# In effect the single classes shadow the class tree, leading to the fact that
# a class method defined in a super_class is accessible to a derived class in
# much the same way as normal methods are accessible in (normal) derived classes.
def super_class
@clazz.super_class.single_class if @clazz.super_class
end
# return the name of the superclass (see there)
def super_class_name
super_class.name if @clazz.super_class
end
end
end