Class: Phenomenal::Adaptation

Inherits:
Object
  • Object
show all
Defined in:
lib/phenomenal/context/adaptation.rb

Overview

Represent a method adaptation for a particular context

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context, klass, method_name, instance_adapatation, implementation) ⇒ Adaptation

Returns a new instance of Adaptation.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/phenomenal/context/adaptation.rb', line 7

def initialize(context,klass, method_name,instance_adapatation,implementation)
  @context = context
  @klass = klass
  @method_name = method_name
  @implementation = implementation
  @instance_adaptation=instance_adapatation
  check_validity
  # Save the source location if any, this is used to find again the adaptation
  # in a proceed call. It always exists except for method directly
  # implemented in C -> Not a problem because these one never use proceed
  source_location = implementation.source_location
  if source_location
    @src_file = implementation.source_location[0]
    @src_line = implementation.source_location[1]
  end
end

Instance Attribute Details

#contextObject

Returns the value of attribute context.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def context
  @context
end

#implementationObject

Returns the value of attribute implementation.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def implementation
  @implementation
end

#instance_adaptationObject Also known as: instance_adaptation?

Returns the value of attribute instance_adaptation.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def instance_adaptation
  @instance_adaptation
end

#klassObject

Returns the value of attribute klass.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def klass
  @klass
end

#method_nameObject

Returns the value of attribute method_name.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def method_name
  @method_name
end

#src_fileObject

Returns the value of attribute src_file.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def src_file
  @src_file
end

#src_lineObject

Returns the value of attribute src_line.



3
4
5
# File 'lib/phenomenal/context/adaptation.rb', line 3

def src_line
  @src_line
end

Instance Method Details

#bind(instance, *args, &block) ⇒ Object

Bind the implementation corresponding to this adaptation to ‘instance’ when instance_adaptation or to implementation class when class method



38
39
40
41
42
43
44
45
# File 'lib/phenomenal/context/adaptation.rb', line 38

def bind(instance,*args,&block)
  target = instance_adaptation? ? instance : klass
  if implementation.is_a?(Proc)
    bind_proc(target,*args,&block)
  else
    bind_method(target,*args,&block)
  end
end

#concern?(klass, method_name, instance_adaptation) ⇒ Boolean

True if the adaptation concern the class n_klass and method n_method

Returns:

  • (Boolean)


48
49
50
51
52
# File 'lib/phenomenal/context/adaptation.rb', line 48

def concern?(klass,method_name,instance_adaptation)
  self.klass==klass && 
  self.method_name==method_name && 
  self.instance_adaptation==instance_adaptation
end

#deployObject

Deploy actually the adaptation in the target class by overriding the current implementation



26
27
28
29
30
31
32
33
34
# File 'lib/phenomenal/context/adaptation.rb', line 26

def deploy
  method_name = self.method_name
  implementation = self.implementation
  if instance_adaptation?
    klass.class_eval { define_method(method_name, implementation) }
  else
    klass.define_singleton_method(method_name,implementation)
  end
end

#to_sObject

String representation



55
56
57
# File 'lib/phenomenal/context/adaptation.rb', line 55

def to_s
 ":#{context.name} => #{klass.name}.#{method_name} :: #{src_file}:#{src_line}"
end