state-fu 0.12.3 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +1 -1
- data/lib/binding.rb +10 -5
- data/lib/executioner.rb +23 -90
- data/lib/lathe.rb +1 -1
- data/lib/machine.rb +19 -16
- data/lib/method_factory.rb +100 -142
- data/lib/persistence.rb +2 -2
- data/lib/persistence/active_record.rb +3 -3
- data/lib/persistence/attribute.rb +4 -4
- data/lib/persistence/base.rb +4 -20
- data/lib/state-fu.rb +4 -2
- data/lib/support/core_ext.rb +22 -44
- data/lib/support/{logger.rb → logging.rb} +5 -5
- data/lib/transition.rb +11 -13
- data/spec/features/active_record_auto_save_spec.rb +22 -0
- data/spec/features/not_requirements_spec.rb +37 -75
- data/spec/features/shared_log_spec.rb +1 -1
- data/spec/integration/active_record_persistence_spec.rb +21 -13
- data/spec/integration/example_01_document_spec.rb +5 -4
- data/spec/integration/requirement_reflection_spec.rb +5 -4
- data/spec/integration/transition_spec.rb +2 -2
- data/spec/spec_helper.rb +2 -2
- data/spec/state_fu_spec.rb +45 -52
- data/spec/units/binding_spec.rb +1 -1
- metadata +5 -6
- data/lib/support/methodical.rb +0 -17
- data/spec/features/method_missing_only_once_spec.rb +0 -28
data/README.textile
CHANGED
data/lib/binding.rb
CHANGED
@@ -19,16 +19,16 @@ module StateFu
|
|
19
19
|
@options = options.symbolize_keys!
|
20
20
|
if options[:singleton]
|
21
21
|
@target = object
|
22
|
-
else
|
22
|
+
else
|
23
23
|
@target = object.class
|
24
24
|
@options = @target.state_fu_options[@method_name].merge(options)
|
25
|
-
end
|
26
|
-
@field_name = @options.delete(:field_name) || raise("No field_name supplied")
|
25
|
+
end
|
26
|
+
@field_name = @options.delete(:field_name) || raise("No field_name supplied")
|
27
27
|
@persister = Persistence.for self
|
28
28
|
|
29
29
|
# define event methods on this binding and its @object
|
30
30
|
MethodFactory.new(self).install!
|
31
|
-
@machine.helpers.inject_into self
|
31
|
+
@machine.helpers.inject_into self
|
32
32
|
end
|
33
33
|
|
34
34
|
alias_method :o, :object
|
@@ -143,7 +143,6 @@ module StateFu
|
|
143
143
|
def transition( event_or_array, *args, &block )
|
144
144
|
return transitions.with(*args, &block).find(event_or_array)
|
145
145
|
end
|
146
|
-
|
147
146
|
#
|
148
147
|
# next_transition and friends: when there's exactly one valid move
|
149
148
|
#
|
@@ -292,5 +291,11 @@ module StateFu
|
|
292
291
|
s
|
293
292
|
end
|
294
293
|
|
294
|
+
# little kludge - allows the binding to reuse the same method definitions as 'object'
|
295
|
+
# in MethodFactory#method_definitions_for
|
296
|
+
def state_fu(name=nil)
|
297
|
+
self
|
298
|
+
end
|
299
|
+
|
295
300
|
end
|
296
301
|
end
|
data/lib/executioner.rb
CHANGED
@@ -1,65 +1,40 @@
|
|
1
1
|
module StateFu
|
2
2
|
#
|
3
|
-
#
|
4
|
-
# your object.
|
3
|
+
# class that handles executing stuff in the context of your 'object'
|
5
4
|
#
|
6
5
|
|
7
6
|
class Executioner
|
8
7
|
|
9
|
-
|
10
|
-
# instance_methods.each { |m| undef_method m unless m =~ /(^__|^self|^nil\?$|^send$|proxy_|^object_id|^respond_to\?|^instance_exec|^instance_eval|^method$)/ }
|
8
|
+
attr_reader :transition, :object
|
11
9
|
|
12
10
|
def initialize transition, &block
|
13
|
-
@transition
|
14
|
-
@
|
15
|
-
@__self___ = self
|
16
|
-
yield self if block_given?
|
17
|
-
# forces method_missing to snap back to its pre-state-fu condition:
|
18
|
-
# @__target__.initialize_state_fu!
|
11
|
+
@transition = transition
|
12
|
+
@object = transition.object
|
19
13
|
self
|
20
14
|
end
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
delegate :halt!, :to => :transition
|
27
|
-
delegate :args, :to => :transition
|
28
|
-
delegate :options, :to => :transition
|
29
|
-
|
30
|
-
def binding
|
31
|
-
transition.binding
|
32
|
-
end
|
33
|
-
|
34
|
-
attr_reader :transition, :__target__, :__self__
|
35
|
-
|
36
|
-
alias_method :t, :transition
|
37
|
-
alias_method :current_transition, :transition
|
38
|
-
alias_method :context, :transition
|
39
|
-
alias_method :ctx, :transition
|
40
|
-
|
41
|
-
alias_method :arguments, :args
|
42
|
-
alias_method :transition_arguments, :args
|
43
|
-
|
44
|
-
def machine
|
45
|
-
binding.machine
|
16
|
+
def evaluate method_name_or_proc
|
17
|
+
args = [transition, transition.arguments]
|
18
|
+
evaluate_with_arguments(method_name_or_proc, *args)
|
46
19
|
end
|
47
20
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
elsif respond_to
|
21
|
+
private
|
22
|
+
|
23
|
+
def evaluate_with_arguments method_name_or_proc, *arguments
|
24
|
+
if method_name_or_proc.is_a?(Proc) &&
|
25
|
+
meth = method_name_or_proc
|
26
|
+
# got a proc
|
27
|
+
elsif meth = transition.machine.named_procs[method_name_or_proc]
|
28
|
+
# got a named proc belonging to the machine
|
29
|
+
elsif object.__send__(:respond_to?, method_name_or_proc, true) &&
|
30
|
+
meth = object.__send__(:method, method_name_or_proc)
|
31
|
+
# got the name of a method on 'object'
|
57
32
|
elsif method_name_or_proc.to_s =~ /^not?_(.*)$/
|
58
|
-
# special case:
|
59
|
-
# boolean opposite of its evaluation result
|
60
|
-
return !( evaluate_with_arguments $1, *
|
33
|
+
# special case: given a method name prefixed with no_ or not_
|
34
|
+
# return the boolean opposite of its evaluation result
|
35
|
+
return !( evaluate_with_arguments $1.to_sym, *arguments )
|
61
36
|
else
|
62
|
-
raise NoMethodError.new( "undefined method_name `#{method_name_or_proc.to_s}' for \"#{
|
37
|
+
raise NoMethodError.new( "undefined method_name `#{method_name_or_proc.to_s}' for \"#{object}\":#{object.class.to_s}" )
|
63
38
|
end
|
64
39
|
|
65
40
|
if arguments.length < meth.arity.abs && meth.arity != -1
|
@@ -71,50 +46,8 @@ module StateFu
|
|
71
46
|
end
|
72
47
|
|
73
48
|
# execute it!
|
74
|
-
|
75
|
-
self.instance_exec *arguments, &meth
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def evaluate method_name_or_proc
|
80
|
-
arguments = [transition, args, __target__]
|
81
|
-
evaluate_with_arguments(method_name_or_proc, *arguments)
|
82
|
-
end
|
83
|
-
|
84
|
-
alias_method :executioner_respond_to?, :respond_to?
|
85
|
-
|
86
|
-
def respond_to? method_name, include_private = false
|
87
|
-
executioner_respond_to?(method_name, include_private) ||
|
88
|
-
__target__.__send__( :respond_to?, method_name, include_private )
|
89
|
-
end
|
90
|
-
|
91
|
-
alias_method :executioner_method, :method
|
92
|
-
def method method_name
|
93
|
-
begin
|
94
|
-
executioner_method(method_name)
|
95
|
-
rescue NameError
|
96
|
-
__target__.__send__ :method, method_name
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
# Forwards any missing method call to the \target.
|
103
|
-
# TODO / NOTE: we don't (can't ?) handle block arguments ...
|
104
|
-
def method_missing(method_name, *args)
|
105
|
-
if __target__.respond_to?(method_name, true)
|
106
|
-
begin
|
107
|
-
meth = __target__.__send__ :method, method_name
|
108
|
-
rescue NameError
|
109
|
-
super
|
110
|
-
end
|
111
|
-
__target__.instance_exec( *args, &meth)
|
112
|
-
else # let's hope it's a named proc
|
113
|
-
evaluate_with_arguments(method_name, *args)
|
114
|
-
end
|
115
|
-
|
49
|
+
object.__send__(:instance_exec, *arguments, &meth)
|
116
50
|
end
|
117
51
|
|
118
|
-
# NOTE: const_missing is not handled.
|
119
52
|
end
|
120
53
|
end
|
data/lib/lathe.rb
CHANGED
@@ -442,7 +442,7 @@ module StateFu
|
|
442
442
|
|
443
443
|
# allow requirements and messages to be added as options
|
444
444
|
if k = [:requires, :guard, :must, :must_be, :needs].detect {|k| options.has_key?(k) }
|
445
|
-
#
|
445
|
+
# Logging.debug("removing option #{k} - will use as requirement ..")
|
446
446
|
req = options.delete(k)
|
447
447
|
msg = options.delete(:message) || options.delete(:msg)
|
448
448
|
raise ArgumentError unless msg.nil? || req.is_a?(Symbol)
|
data/lib/machine.rb
CHANGED
@@ -4,10 +4,10 @@ module StateFu
|
|
4
4
|
def self.BINDINGS
|
5
5
|
@@_bindings ||= {}
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
include Applicable
|
9
9
|
include HasOptions
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :hooks
|
12
12
|
|
13
13
|
#
|
@@ -19,17 +19,17 @@ module StateFu
|
|
19
19
|
name = name.to_sym
|
20
20
|
unless machine = klass.state_fu_machines[ name ]
|
21
21
|
machine = new(options)
|
22
|
-
machine.bind! klass, name, options
|
23
22
|
end
|
24
23
|
if block_given?
|
25
|
-
machine.apply! &block
|
24
|
+
machine.apply! &block
|
26
25
|
end
|
26
|
+
machine.bind! klass, name, options
|
27
27
|
machine
|
28
28
|
end
|
29
29
|
|
30
30
|
# make it so that a class which has included StateFu has a binding to
|
31
31
|
# this machine
|
32
|
-
def self.bind!(machine, owner, name, options={})
|
32
|
+
def self.bind!(machine, owner, name, options={})
|
33
33
|
name = name.to_sym
|
34
34
|
options[:define_methods] = (name == DEFAULT) unless options.symbolize_keys!.has_key?(:define_methods)
|
35
35
|
options[:field_name] ||= Persistence.default_field_name(name)
|
@@ -40,14 +40,17 @@ module StateFu
|
|
40
40
|
MethodFactory.define_singleton_method(owner, name) { _binding }
|
41
41
|
if alias_name = options[:alias] || options[:as]
|
42
42
|
MethodFactory.define_singleton_method(owner, alias_name) { _binding }
|
43
|
-
end
|
43
|
+
end
|
44
44
|
else
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
klass = owner
|
46
|
+
klass.state_fu_machines[name] = machine
|
47
|
+
klass.state_fu_options[name] = options
|
48
|
+
|
49
|
+
# prepare the state machine accessor method
|
50
|
+
if owner.respond_to? name
|
51
|
+
raise "FIXME " + name
|
52
|
+
else
|
53
|
+
klass.class_eval do
|
51
54
|
define_method name do
|
52
55
|
state_fu name
|
53
56
|
end
|
@@ -57,6 +60,10 @@ module StateFu
|
|
57
60
|
end
|
58
61
|
end
|
59
62
|
end
|
63
|
+
|
64
|
+
# prepare event / state class methods
|
65
|
+
StateFu::MethodFactory.prepare_class_machine klass, machine, name, options
|
66
|
+
|
60
67
|
# prepare the persistence field
|
61
68
|
StateFu::Persistence.prepare_field owner, options[:field_name]
|
62
69
|
end
|
@@ -99,10 +106,6 @@ module StateFu
|
|
99
106
|
tools.inject_into( obj )
|
100
107
|
end
|
101
108
|
|
102
|
-
def inject_methods_into( obj )
|
103
|
-
#puts 'inject_methods_into'
|
104
|
-
end
|
105
|
-
|
106
109
|
# the modules listed here will be mixed into Binding and
|
107
110
|
# Transition objects for this machine. use this to define methods,
|
108
111
|
# references or data useful to you during transitions, event
|
data/lib/method_factory.rb
CHANGED
@@ -4,106 +4,110 @@ module StateFu
|
|
4
4
|
# TODO: all events, simple or complex, should get the same method signature
|
5
5
|
# simple events will be called as: event_name! nil, *args
|
6
6
|
# complex events will be called as: event_name! :state, *args
|
7
|
-
|
7
|
+
|
8
8
|
class MethodFactory
|
9
9
|
attr_accessor :method_definitions
|
10
10
|
attr_reader :binding, :machine
|
11
11
|
|
12
12
|
# An instance of MethodFactory is created to define methods on a specific StateFu::Binding, and
|
13
13
|
# on the object it is bound to.
|
14
|
-
|
14
|
+
|
15
15
|
def initialize(_binding)
|
16
|
-
@binding
|
17
|
-
@machine
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# simple event methods
|
22
|
-
# all arguments are passed into the transition / transition query
|
23
|
-
|
24
|
-
simple_events.each do |event|
|
25
|
-
method_definitions["#{event.name}"] = lambda do |*args|
|
26
|
-
_binding.find_transition(event, event.target, *args)
|
27
|
-
end
|
28
|
-
|
29
|
-
method_definitions["can_#{event.name}?"] = lambda do |*args|
|
30
|
-
_binding.can_transition?(event, event.target, *args)
|
31
|
-
end
|
16
|
+
@binding = _binding
|
17
|
+
@machine = binding.machine
|
18
|
+
@method_definitions = MethodFactory.method_definitions_for(@machine, @binding.method_name)
|
19
|
+
self
|
20
|
+
end
|
32
21
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
22
|
+
def self.method_definitions_for(machine, name)
|
23
|
+
returning({}) do |method_definitions|
|
24
|
+
simple_events, complex_events = machine.events.partition &:simple?
|
37
25
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# returns a new transition. Will raise an IllegalTransition if
|
45
|
-
# it is not given arguments which result in a valid combination
|
46
|
-
# of event and target state being deducted.
|
47
|
-
#
|
48
|
-
# object.event_name [nil] suffices if the event has only one valid
|
49
|
-
# target (ie only one transition which would not raise a
|
50
|
-
# RequirementError if fired)
|
51
|
-
|
52
|
-
# object.event_name! [:target], *arguments
|
53
|
-
#
|
54
|
-
# as per the method above, except that it also fires the event
|
55
|
-
|
56
|
-
# object.can_event_name? [:target], *arguments
|
57
|
-
#
|
58
|
-
# tests that calling event_name or event_name! would not raise an error
|
59
|
-
# ie, the transition is legal and is valid with the arguments supplied
|
60
|
-
|
61
|
-
complex_events.each do |event|
|
62
|
-
method_definitions["#{event.name}"] = lambda do |target, *args|
|
63
|
-
_binding.find_transition(event, target, *args)
|
64
|
-
end
|
65
|
-
|
66
|
-
method_definitions["can_#{event.name}?"] = lambda do |target, *args|
|
67
|
-
begin
|
68
|
-
t = _binding.find_transition(event, target, *args)
|
69
|
-
t.valid?
|
70
|
-
rescue IllegalTransition
|
71
|
-
false
|
26
|
+
# simple event methods
|
27
|
+
# all arguments are passed into the transition / transition query
|
28
|
+
|
29
|
+
simple_events.each do |event|
|
30
|
+
method_definitions["#{event.name}"] = lambda do |*args|
|
31
|
+
state_fu(name).find_transition(event, event.target, *args)
|
72
32
|
end
|
73
|
-
end
|
74
33
|
|
75
|
-
|
76
|
-
|
34
|
+
method_definitions["can_#{event.name}?"] = lambda do |*args|
|
35
|
+
state_fu(name).can_transition?(event, event.target, *args)
|
36
|
+
end
|
37
|
+
|
38
|
+
method_definitions["#{event.name}!"] = lambda do |*args|
|
39
|
+
state_fu(name).fire_transition!(event, event.target, *args)
|
40
|
+
end
|
77
41
|
end
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
42
|
+
|
43
|
+
# complex event methods
|
44
|
+
# the first argument is the target state
|
45
|
+
# any remaining arguments are passed into the transition / transition query
|
46
|
+
|
47
|
+
# object.event_name [:target], *arguments
|
48
|
+
#
|
49
|
+
# returns a new transition. Will raise an IllegalTransition if
|
50
|
+
# it is not given arguments which result in a valid combination
|
51
|
+
# of event and target state being deducted.
|
52
|
+
#
|
53
|
+
# object.event_name [nil] suffices if the event has only one valid
|
54
|
+
# target (ie only one transition which would not raise a
|
55
|
+
# RequirementError if fired)
|
56
|
+
|
57
|
+
# object.event_name! [:target], *arguments
|
58
|
+
#
|
59
|
+
# as per the method above, except that it also fires the event
|
60
|
+
|
61
|
+
# object.can_event_name? [:target], *arguments
|
62
|
+
#
|
63
|
+
# tests that calling event_name or event_name! would not raise an error
|
64
|
+
# ie, the transition is legal and is valid with the arguments supplied
|
65
|
+
|
66
|
+
complex_events.each do |event|
|
67
|
+
method_definitions["#{event.name}"] = lambda do |target, *args|
|
68
|
+
state_fu(name).find_transition(event, target, *args)
|
87
69
|
end
|
88
70
|
|
89
|
-
method_definitions["can_#{event.name}
|
90
|
-
|
71
|
+
method_definitions["can_#{event.name}?"] = lambda do |target, *args|
|
72
|
+
begin
|
73
|
+
t = state_fu(name).find_transition(event, target, *args)
|
74
|
+
t.valid?
|
75
|
+
rescue IllegalTransition
|
76
|
+
false
|
77
|
+
end
|
91
78
|
end
|
92
79
|
|
93
|
-
method_definitions["#{event.name}
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
80
|
+
method_definitions["#{event.name}!"] = lambda do |target, *args|
|
81
|
+
state_fu(name).fire_transition!(event, target, *args)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# methods dedicated to a combination of event and target
|
86
|
+
# all arguments are passed into the transition / transition query
|
87
|
+
|
88
|
+
(simple_events + complex_events).each do |event|
|
89
|
+
event.targets.each do |target|
|
90
|
+
method_definitions["#{event.name}_to_#{target.name}"] = lambda do |*args|
|
91
|
+
state_fu(name).find_transition(event, target, *args)
|
92
|
+
end
|
93
|
+
|
94
|
+
method_definitions["can_#{event.name}_to_#{target.name}?"] = lambda do |*args|
|
95
|
+
state_fu(name).can_transition?(event, target, *args)
|
96
|
+
end
|
97
|
+
|
98
|
+
method_definitions["#{event.name}_to_#{target.name}!"] = lambda do |*args|
|
99
|
+
state_fu(name).fire_transition!(event, target, *args)
|
100
|
+
end
|
101
|
+
end unless event.targets.nil?
|
102
|
+
end
|
103
|
+
|
104
|
+
machine.states.each do |state|
|
105
|
+
method_definitions["#{state.name}?"] = lambda do
|
106
|
+
state_fu(name).current_state == state
|
107
|
+
end
|
102
108
|
end
|
103
109
|
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
110
|
+
end
|
107
111
|
|
108
112
|
#
|
109
113
|
# Class Methods
|
@@ -115,71 +119,25 @@ module StateFu
|
|
115
119
|
# Note this happens when a machine is first bound to the class,
|
116
120
|
# not when StateFu is included.
|
117
121
|
|
118
|
-
def self.
|
119
|
-
|
120
|
-
self.define_once_only_method_missing(klass)
|
121
|
-
end # prepare_class
|
122
|
+
def self.prepare_class_machine(klass, machine, name, options)
|
123
|
+
return unless options[:define_methods]
|
122
124
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
# method_missing.
|
128
|
-
#
|
129
|
-
# method_missing will then revert to its original implementation.
|
130
|
-
#
|
131
|
-
# The purpose of all this is to allow dynamically created methods
|
132
|
-
# to be called, without worrying about whether they have been
|
133
|
-
# defined yet, and without incurring the expense of loading all
|
134
|
-
# the object's StateFu::Bindings before they're likely to be needed.
|
135
|
-
#
|
136
|
-
# Note that if you redefine method_missing on your StateFul
|
137
|
-
# classes, it's best to either do it before you include StateFu,
|
138
|
-
# or thoroughly understand what's happening in
|
139
|
-
# MethodFactory#define_once_only_method_missing.
|
140
|
-
|
141
|
-
def self.define_once_only_method_missing(klass)
|
142
|
-
raise ArgumentError.new(klass.to_s) unless klass.is_a?(Class)
|
143
|
-
|
144
|
-
klass.class_eval do
|
145
|
-
return false if @_state_fu_prepared
|
146
|
-
@_state_fu_prepared = true
|
147
|
-
|
148
|
-
alias_method(:method_missing_before_state_fu, :method_missing) # if defined?(:method_missing, true)
|
149
|
-
|
150
|
-
def method_missing(method_name, *args, &block)
|
151
|
-
# invoke state_fu! to ensure event, etc methods are defined
|
152
|
-
begin
|
153
|
-
state_fu! unless defined? initialize_state_fu!
|
154
|
-
rescue NoMethodError => e
|
155
|
-
raise e
|
156
|
-
end
|
157
|
-
|
158
|
-
# reset method_missing for this instance
|
159
|
-
class << self; self; end.class_eval do
|
160
|
-
alias_method :method_missing, :method_missing_before_state_fu
|
125
|
+
method_definitions_for(machine, name).each do |method_name, block|
|
126
|
+
unless klass.respond_to? method_name, true
|
127
|
+
klass.class_eval do
|
128
|
+
define_method method_name, &block
|
161
129
|
end
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
# for its state machines, which defined singleton methods for its
|
167
|
-
# states & events when it was constructed.
|
168
|
-
__send__ method_name, *args, &block
|
169
|
-
else
|
170
|
-
# call the original method_missing (method_missing_before_state_fu)
|
171
|
-
method_missing method_name, *args, &block
|
172
|
-
end
|
173
|
-
end # method_missing
|
174
|
-
end # class_eval
|
175
|
-
end # define_once_only_method_missing
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end # prepare_class
|
176
134
|
|
177
135
|
# Define the same helper methods on the StateFu::Binding and its
|
178
136
|
# object. Any existing methods will not be tampered with, but a
|
179
137
|
# warning will be issued in the logs if any methods cannot be defined.
|
180
138
|
def install!
|
181
|
-
define_event_methods_on @binding
|
182
|
-
define_event_methods_on @binding.object if @binding.options[:define_methods]
|
139
|
+
define_event_methods_on @binding
|
140
|
+
define_event_methods_on @binding.object if @binding.options[:define_methods] && @binding.options[:singleton]
|
183
141
|
end
|
184
142
|
|
185
143
|
#
|
@@ -225,7 +183,7 @@ module StateFu
|
|
225
183
|
def self.define_singleton_method(object, method_name, options={}, &block)
|
226
184
|
if object.respond_to? method_name, true
|
227
185
|
msg = !options[:force]
|
228
|
-
|
186
|
+
Logging.info "Existing method #{method(method_name) rescue [method_name].inspect} "\
|
229
187
|
"for #{object.class} #{object} "\
|
230
188
|
"#{options[:force] ? 'WILL' : 'won\'t'} "\
|
231
189
|
"be overwritten."
|
@@ -237,7 +195,7 @@ module StateFu
|
|
237
195
|
end
|
238
196
|
end
|
239
197
|
alias_method :define_singleton_method, :define_singleton_method
|
240
|
-
|
198
|
+
|
241
199
|
end # class MethodFactory
|
242
200
|
end # module StateFu
|
243
201
|
|