Module: ASIR::CodeMore

Includes:
CodeBlock, ObjectResolving
Included in:
Message
Defined in:
lib/asir/code_more.rb

Overview

!SLIDE Code More

Help encode/decode and resolve receiver class.

Defined Under Namespace

Modules: Result

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CodeBlock

block_cache, block_to_code, code_to_block, #decode_block!, #encode_block!

Methods included from ObjectResolving

#resolve_object

Instance Attribute Details

#receiver_nameObject

Returns the value of attribute receiver_name.



10
11
12
# File 'lib/asir/code_more.rb', line 10

def receiver_name
  @receiver_name
end

Instance Method Details

#decode_more!Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/asir/code_more.rb', line 28

def decode_more!
  decode_block!
  if ::String === @receiver_class
    # pp [ :decode_more!, self ]
    @receiver_class = resolve_object(@receiver_class)
    @receiver = resolve_object(@receiver) if @receiver_name
    unless @receiver_class === @receiver
      raise Error, "receiver #{@receiver.class.name} is not a #{@receiver_class}" 
    end
  end
  self
end

#descriptionObject

Returns “Module.selector” if receiver is Module. Returns “Class#selector” if receiver is an instance.



58
59
60
61
# File 'lib/asir/code_more.rb', line 58

def description
  x = message_kind
  "#{x[0]}#{x[1]}#{@selector}"
end

#encode_more!Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/asir/code_more.rb', line 12

def encode_more!
  obj = encode_block! # may self.dup
  unless ::String === @receiver_class
    obj ||= self.dup # dont dup twice.
    if ::Module === @receiver
      obj.receiver_name = true
      obj.receiver = @receiver.name
    end
    obj.receiver_class = @receiver_class.name
    if resp = obj.result and resp.message == self
      resp.message = obj
    end
  end
  obj || self
end

#message_kindObject

If receiver is a Module (i.e. class or module message),

Returns [ name of the Module, :'.' ]

Otherwise

Returns [ name of the receiver's Class, :'#' ]


45
46
47
48
49
50
51
52
53
54
# File 'lib/asir/code_more.rb', line 45

def message_kind
  case
  when ::String === @receiver_class
    [ @receiver_class, :'.' ]
  when ::Module === @receiver
    [ @receiver.name, :'.' ]
  else
    [ @receiver_class.name, :'#' ]
  end
end