rubyx/lib/parfait/module.rb
Torsten Ruger 4e3640e432 shift code from class to module
as class derives from module, module carries
much of the code that one thinks of as class
class only handles allocation really
2015-05-18 12:35:01 +03:00

64 lines
2.6 KiB
Ruby

# A module describes the capabilities of a group of objects, ie what data it has
# and functions it responds to.
# The group may be a Class, but a module may be included into classes and objects too.
#
# The class also keeps a list of class methods (with names+code)
# Class methods are instance methods on the class object
# So it is essential that the class (the object defining the class)
# can carry methods. It does so as instance variables.
# In fact this property is implemented in the Object, as methods
# may be added to any object at run-time
module Parfait
class Module < Object
def initialize name , superclass
@instance_methods = []
@name = name.to_sym
@super_class = superclass
@meta_class = Virtual::MetaClass.new(self)
end
def add_instance_method method
raise "not a method #{method.class} #{method.inspect}" unless method.is_a? Virtual::CompiledMethod
raise "syserr " unless method.name.is_a? Symbol
@instance_methods << method
end
# this needs to be done during booting as we can't have all the classes and superclassses
# instantiated. By that logic it should maybe be part of vm rather.
# On the other hand vague plans to load the hierachy from sof exist, so for now...
def set_super_class sup
@super_class = sup
end
def get_instance_method fname
fname = fname.to_sym
@instance_methods.detect{ |fun| fun.name == fname }
end
# get the method and if not found, try superclasses. raise error if not found
def resolve_method m_name
method = get_instance_method(m_name)
unless method
unless( @name == "Object" )
supr = Space.space.get_class_by_name(@super_class_name)
method = supr.resolve_method(m_name)
end
end
raise "Method not found #{m_name}, for #{@name}" unless method
method
end
# :<, :<=, :>, :>=, :included_modules, :include?, :name, :ancestors, :instance_methods, :public_instance_methods,
# :protected_instance_methods, :private_instance_methods, :constants, :const_get, :const_set, :const_defined?,
# :const_missing, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set,
# :class_variable_defined?, :public_constant, :private_constant, :singleton_class?, :include, :prepend,
# :module_exec, :class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?,
# :private_method_defined?, :protected_method_defined?, :public_class_method, :private_class_method, :autoload,
# :autoload?, :instance_method, :public_instance_method
end
end