Class: HDLRuby::High::Namespace
- Inherits:
-
Object
- Object
- HDLRuby::High::Namespace
- Includes:
- SingletonExtend
- Defined in:
- lib/HDLRuby/hruby_high.rb
Overview
Describes a namespace. Used for managing the access points to internals of hardware constructs.
Constant Summary collapse
- RESERVED =
The reserved names
[ :user, :initialize, :add_method, :concat_namespace, :to_namespace, :user?, :user_deep? ]
Instance Attribute Summary collapse
-
#user ⇒ Object
readonly
The construct using the namespace.
Instance Method Summary collapse
-
#add_method(name, &ruby_block) ⇒ Object
Adds method +name+ provided the name is not empty and the method is not already defined in the current namespace.
-
#clone ⇒ Object
Clones (safely) the namespace.
-
#concat_namespace(namespace) ⇒ Object
Concats another +namespace+ to current one.
-
#initialize(user) ⇒ Namespace
constructor
Creates a new namespace attached to +user+.
-
#to_namespace ⇒ Object
Ensure it is a namespace.
-
#user?(object) ⇒ Boolean
Tell if an +object+ is the user of the namespace.
-
#user_deep?(object) ⇒ Boolean
Tell if an +object+ is the user of the namespace or of one of its concats.
Methods included from SingletonExtend
Constructor Details
#initialize(user) ⇒ Namespace
Creates a new namespace attached to +user+.
63 64 65 66 67 68 |
# File 'lib/HDLRuby/hruby_high.rb', line 63 def initialize(user) # Sets the user. @user = user # Initialize the concat namespaces. @concats = [] end |
Instance Attribute Details
#user ⇒ Object (readonly)
The construct using the namespace.
60 61 62 |
# File 'lib/HDLRuby/hruby_high.rb', line 60 def user @user end |
Instance Method Details
#add_method(name, &ruby_block) ⇒ Object
Adds method +name+ provided the name is not empty and the method is not already defined in the current namespace.
83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/HDLRuby/hruby_high.rb', line 83 def add_method(name,&ruby_block) # puts "add_method with name=#{name} and parameters=#{ruby_block.parameters}" unless name.empty? then if RESERVED.include?(name.to_sym) then raise AnyError, "Resevered name #{name} cannot be overridden." end if self.respond_to?(name) then raise AnyError, "Symbol #{name} is already defined." end define_singleton_method(name,&ruby_block) end end |
#clone ⇒ Object
Clones (safely) the namespace.
71 72 73 74 75 76 77 78 79 |
# File 'lib/HDLRuby/hruby_high.rb', line 71 def clone # Create the new namespace. res = Namespace.new(@user) # Adds the concats. @concats.each do |concat| res.concat_namespace(concat) end return res end |
#concat_namespace(namespace) ⇒ Object
Concats another +namespace+ to current one.
99 100 101 102 103 104 105 |
# File 'lib/HDLRuby/hruby_high.rb', line 99 def concat_namespace(namespace) # Ensure namespace is really a namespace and concat it. namespace = namespace.to_namespace self.eigen_extend(namespace) # Adds the concat the the list. @concats << namespace end |
#to_namespace ⇒ Object
Ensure it is a namespace
108 109 110 |
# File 'lib/HDLRuby/hruby_high.rb', line 108 def to_namespace return self end |
#user?(object) ⇒ Boolean
Tell if an +object+ is the user of the namespace.
113 114 115 |
# File 'lib/HDLRuby/hruby_high.rb', line 113 def user?(object) return @user.equal?(object) end |
#user_deep?(object) ⇒ Boolean
Tell if an +object+ is the user of the namespace or of one of its concats.
119 120 121 122 123 124 125 126 127 |
# File 'lib/HDLRuby/hruby_high.rb', line 119 def user_deep?(object) # puts "@user=#{@user}, @concats=#{@concats.size}, object=#{object}" # Convert the object to a user if appliable (for SystemT) object = object.to_user if object.respond_to?(:to_user) # Maybe object is the user of this namespace. return true if user?(object) # No, try in the concat namespaces. @concats.any? { |concat| concat.user_deep?(object) } end |