Class: Kobako::Namespace

Inherits:
Object
  • Object
show all
Defined in:
lib/kobako/namespace.rb

Overview

A named grouping of Members for one Sandbox (docs/behavior.md B-07..B-11). 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 (docs/behavior.md B-07/B-08 Notes).

/\A[A-Z]\w*\z/

Instance Attribute Summary collapse

Instance Method Summary collapse

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).



18
19
20
21
22
# File 'lib/kobako/namespace.rb', line 18

def initialize(name)
  @name = name
  @members = {} # : Hash[String, untyped]
  @sealed = false
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



13
14
15
# File 'lib/kobako/namespace.rb', line 13

def name
  @name
end

Instance Method Details

#bind(member, object) ⇒ Object

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 (docs/behavior.md B-11), or when the owning Sandbox’s first invocation has sealed Service registration (docs/behavior.md E-45).

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
# File 'lib/kobako/namespace.rb', line 32

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.



53
54
55
56
57
58
59
60
61
# File 'lib/kobako/namespace.rb', line 53

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!Object

Mark this Namespace as sealed (docs/behavior.md B-33). Called by Kobako::Catalog::Namespaces#seal! on the owning Sandbox’s first invocation; afterwards #bind raises ArgumentError (E-45). Idempotent; returns self.



46
47
48
49
# File 'lib/kobako/namespace.rb', line 46

def seal!
  @sealed = true
  self
end

#to_preambleObject

Structured description for the guest preamble (Frame 1). Returns a two-element array [name, member_keys] suitable for msgpack encoding.



65
66
67
# File 'lib/kobako/namespace.rb', line 65

def to_preamble
  [@name, @members.keys]
end