Class: Class
- Defined in:
- lib/fOOrth/core/class.rb,
lib/fOOrth/library/introspection/class.rb
Overview
-
library/introspection/class.rb - Class support for introspection.
Instance Method Summary collapse
-
#create_foorth_instance(vm) ⇒ Object
Create an instance of this fOOrth class.
-
#create_foorth_proxy(proxy_name = nil) ⇒ Object
Add this class as a proxy class in the foorth class system.
-
#create_foorth_subclass(foorth_name) ⇒ Object
Create a new fOOrth subclass of this class.
-
#create_shared_method(name, spec_class, options, &block) ⇒ Object
Create a shared method on this fOOrth class.
-
#foorth_class_name ⇒ Object
Get the name of the class or a safe default.
-
#foorth_method_info(name) ⇒ Object
Investigate a method of this class.
-
#foorth_name ⇒ Object
Get the foorth name of this class.
-
#foorth_name=(new_name) ⇒ Object
Set the foorth name of this class.
-
#foorth_shared ⇒ Object
Access/create the class’s shared fOOrth dictionary.
-
#get_info ⇒ Object
Get introspection info.
-
#lineage ⇒ Object
Get the lineage of this class.
-
#map_foorth_shared(symbol) ⇒ Object
Map the symbol to a specification or nil if there is no mapping.
-
#map_foorth_shared_info(symbol, shallow = nil) ⇒ Object
Get information about the mapping of the symbol.
Instance Method Details
#create_foorth_instance(vm) ⇒ Object
Create an instance of this fOOrth class.
Parameters:
-
vm - The current fOOrth virtual machine.
59 60 61 62 |
# File 'lib/fOOrth/core/class.rb', line 59 def create_foorth_instance(vm) (obj = self.new).foorth_init(vm) obj end |
#create_foorth_proxy(proxy_name = nil) ⇒ Object
Add this class as a proxy class in the foorth class system.
Parameters:
-
proxy_name - the optional name of the proxy. Defaults to the Ruby name.
Returns:
-
The spec of the proxy class.
89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/fOOrth/core/class.rb', line 89 def create_foorth_proxy(proxy_name = nil) if proxy_name self.foorth_name = proxy_name end validate_class_name(foorth_name) error "F10: The class #{foorth_name} already exists." if $FOORTH_GLOBALS[foorth_name] install_foorth_class(foorth_name, self) end |
#create_foorth_subclass(foorth_name) ⇒ Object
Create a new fOOrth subclass of this class.
Parameters:
-
foorth_name - The foorth_name of the new sub-class.
Returns:
-
The spec of the subclass.
Note:
-
If a sub-class with the given name already exists, an exception is raised.
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/fOOrth/core/class.rb', line 71 def create_foorth_subclass(foorth_name) if $FOORTH_GLOBALS[XfOOrth::SymbolMap.map(foorth_name)] error "F10: The class #{foorth_name} already exists." end validate_class_name(foorth_name) new_class = Class.new(self) {self.foorth_name = foorth_name} XfOOrth.const_set('XfOOrth_' + foorth_name, new_class) install_foorth_class(foorth_name, new_class) end |
#create_shared_method(name, spec_class, options, &block) ⇒ Object
Create a shared method on this fOOrth class.
Parameters:
-
name - The name of the method to create.
-
spec_class - The specification class to use.
-
options - An array of options.
-
block - A block to associate with the name.
Returns
-
The spec created for the shared method.
40 41 42 43 44 45 46 47 48 49 |
# File 'lib/fOOrth/core/class.rb', line 40 def create_shared_method(name, spec_class, , &block) sym = XfOOrth::SymbolMap.add_entry(name) spec = spec_class.new(name, sym, , &block) unless self == Object && .include?(:stub) define_method(sym, &spec.does) end foorth_shared[sym] = spec end |
#foorth_class_name ⇒ Object
Get the name of the class or a safe default.
14 15 16 |
# File 'lib/fOOrth/core/class.rb', line 14 def foorth_class_name self.foorth_name || "AnonymousClass<#{self.object_id}>".freeze end |
#foorth_method_info(name) ⇒ Object
Investigate a method of this class.
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/fOOrth/library/introspection/class.rb', line 28 def foorth_method_info(name) symbol, results = XfOOrth::SymbolMap.map_info(name) found = false if symbol if scrape_method_info(results, *map_foorth_shared_info(symbol)) found = true end if scrape_method_info(results, *map_foorth_exclusive_info(symbol, "Class")) found = true end results << ["Scope", "not found."] unless found end results end |
#foorth_name ⇒ Object
Get the foorth name of this class.
Decree!
-
These are to be the only references to @_private_foorth_name!
9 10 11 |
# File 'lib/fOOrth/core/class.rb', line 9 def foorth_name @_private_foorth_name ||= name.gsub(/.*::/, '').freeze end |
#foorth_name=(new_name) ⇒ Object
Set the foorth name of this class.
Decree!
-
These are to be the only references to @_private_foorth_name!
21 22 23 |
# File 'lib/fOOrth/core/class.rb', line 21 def foorth_name=(new_name) @_private_foorth_name = new_name.freeze end |
#foorth_shared ⇒ Object
Access/create the class’s shared fOOrth dictionary.
Decree!
-
This is to be the only reference to @_private_foorth_shared!
28 29 30 |
# File 'lib/fOOrth/core/class.rb', line 28 def foorth_shared @_private_foorth_shared ||= Hash.new end |
#get_info ⇒ Object
Get introspection info.
48 49 50 51 52 53 54 55 |
# File 'lib/fOOrth/library/introspection/class.rb', line 48 def get_info results = [["Lineage", lineage]] get_exclusive_method_info(results, "Class") get_shared_method_info(results) results end |
#lineage ⇒ Object
Get the lineage of this class.
18 19 20 21 22 23 24 25 |
# File 'lib/fOOrth/library/introspection/class.rb', line 18 def lineage #Ugly hack, sorry! if [Object, Module].include?(self) "Object" else foorth_class_name + " < " + superclass.lineage end end |
#map_foorth_shared(symbol) ⇒ Object
Map the symbol to a specification or nil if there is no mapping.
52 53 54 |
# File 'lib/fOOrth/core/class.rb', line 52 def map_foorth_shared(symbol) foorth_shared[symbol] || ((sc = superclass) && sc.map_foorth_shared(symbol)) end |
#map_foorth_shared_info(symbol, shallow = nil) ⇒ Object
Get information about the mapping of the symbol.
7 8 9 10 11 12 13 14 15 |
# File 'lib/fOOrth/library/introspection/class.rb', line 7 def map_foorth_shared_info(symbol, shallow=nil) if (spec = foorth_shared[symbol]) [spec, [["Class", foorth_class_name], ["Scope", "Shared"]]] elsif (sc = superclass) && !shallow sc.map_foorth_shared_info(symbol) else [nil, nil] end end |