Class: Kobako::Namespace
- Inherits:
-
Object
- Object
- Kobako::Namespace
- Defined in:
- lib/kobako/namespace.rb,
sig/kobako/namespace.rbs
Overview
A named grouping of Members for one Sandbox.
Returned by Sandbox#define. Each instance owns a flat name→object
table of Members; member binding is validated against NAME_PATTERN.
Constant Summary collapse
- NAME_PATTERN =
Ruby constant-name pattern shared by Namespace and Member names.
/\A[A-Z]\w*\z/
Instance Attribute Summary collapse
-
#name ⇒ String
readonly
Returns the value of attribute name.
Instance Method Summary collapse
-
#bind(member, object) ⇒ self
Bind
objectundermemberinside this Namespace. -
#fetch(member) ⇒ Object
Member lookup; raises
KeyErrorwhen no Member is registered undermember. -
#initialize(name) ⇒ Namespace
constructor
Build a new Namespace.
-
#seal! ⇒ self
Mark this Namespace as sealed.
-
#to_preamble ⇒ [String, Array[String]]
Structured description for the guest preamble (Frame 1).
- #validate_member_name!(member) ⇒ String
Constructor Details
#initialize(name) ⇒ Namespace
Build a new Namespace. name is an already-validated Namespace
name (must satisfy NAME_PATTERN; validation is the caller's
responsibility).
16 17 18 19 20 |
# File 'lib/kobako/namespace.rb', line 16 def initialize(name) @name = name @members = {} # : Hash[String, untyped] @sealed = false end |
Instance Attribute Details
#name ⇒ String (readonly)
Returns the value of attribute name.
11 12 13 |
# File 'lib/kobako/namespace.rb', line 11 def name @name end |
Instance Method Details
#bind(member, object) ⇒ self
Bind object under member inside this Namespace. member is a
constant-form name as a Symbol or String. object is any Ruby
object that responds to the methods guest code will invoke. Returns
self for chaining. Raises ArgumentError when member does not
match the constant pattern, when a Member of the same name is
already bound, or when the owning Sandbox's first invocation has
sealed Service registration.
29 30 31 32 33 34 35 36 37 |
# File 'lib/kobako/namespace.rb', line 29 def bind(member, object) raise ArgumentError, "cannot bind after first Sandbox invocation" if @sealed member_str = validate_member_name!(member) raise ArgumentError, "Member #{@name}::#{member_str} is already bound" if @members.key?(member_str) @members[member_str] = object self end |
#fetch(member) ⇒ Object
Member lookup; raises KeyError when no Member is registered
under member.
50 51 52 53 54 55 56 57 58 |
# File 'lib/kobako/namespace.rb', line 50 def fetch(member) member_str = member.to_s unless @members.key?(member_str) raise KeyError, "no member named #{member_str.inspect} in namespace #{@name.inspect}" end @members[member_str] end |
#seal! ⇒ self
Mark this Namespace as sealed. Called by
Kobako::Catalog::Namespaces#seal! on the owning Sandbox's first
invocation; afterwards #bind raises ArgumentError. Idempotent;
returns self.
43 44 45 46 |
# File 'lib/kobako/namespace.rb', line 43 def seal! @sealed = true self end |
#to_preamble ⇒ [String, Array[String]]
Structured description for the guest preamble (Frame 1). Returns a
two-element array [name, member_keys] suitable for msgpack encoding.
62 63 64 |
# File 'lib/kobako/namespace.rb', line 62 def to_preamble [@name, @members.keys] end |
#validate_member_name!(member) ⇒ String
68 69 70 71 72 73 74 75 76 |
# File 'lib/kobako/namespace.rb', line 68 def validate_member_name!(member) member_str = member.to_s unless NAME_PATTERN.match?(member_str) raise ArgumentError, "MemberName must match #{NAME_PATTERN.inspect} (got #{member.inspect})" end member_str end |