Class: Nydp::Namespace

Inherits:
Object show all
Includes:
Helper
Defined in:
lib/nydp/namespace.rb

Instance Method Summary collapse

Methods included from Helper

#cons, #list, #literal?, #pair?, #sig, #sym, #sym?

Methods included from Converter

#n2r, #r2n, #rubify

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
# File 'lib/nydp/namespace.rb', line 5

def method_missing name, *args
  if name.to_s =~ /^ns_/
    attr = name.to_s.gsub(/=$/, '').to_sym
    singleton_class.instance_eval do
      attr_accessor attr
    end
    send name, *args
  else
    super
  end
end

Instance Method Details

#apply(name, *args) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/nydp/namespace.rb', line 37

def apply name, *args
  fn = if name.is_a?(String) || name.is_a?(::Symbol)
         fetch name
       elsif name.respond_to? :call
         name
       end

  raise "can't apply #{name.inspect} : not a function" unless fn && fn.respond_to?(:call)

  fn.call *(args.map { |a| r2n a })

rescue StandardError => e
  raise Nydp::Error.new("Invoking #{name}\nwith args (#{args.map(&:_nydp_compact_inspect).join(' ')})")
end

#assign(name, value) ⇒ Object



29
30
31
# File 'lib/nydp/namespace.rb', line 29

def assign name, value
  send "ns_#{ruby_name name}=", value
end

#fetch(name) ⇒ Object



33
34
35
# File 'lib/nydp/namespace.rb', line 33

def fetch name
  send "ns_#{ruby_name name}"
end

#namesObject



17
18
19
# File 'lib/nydp/namespace.rb', line 17

def names
  mm = methods.select { |m| m.to_s =~ /^ns_.*[^=]$/ }.map { |m| nydp_name(m).to_sym }
end

#nydp_name(n) ⇒ Object



21
22
23
# File 'lib/nydp/namespace.rb', line 21

def nydp_name n
  n.to_s.gsub(/^ns_/, '').gsub(/_../) { |ch| ch[1,2].to_i(16).chr }
end

#ruby_name(n) ⇒ Object



25
26
27
# File 'lib/nydp/namespace.rb', line 25

def ruby_name n
  n.to_s._nydp_name_to_rb_name
end