Sha256: 5417d9ed09cc88cc4d714f7f586eb661faf48348c54804e39e592e0b22813add
Contents?: true
Size: 1.47 KB
Versions: 18
Compression:
Stored size: 1.47 KB
Contents
module StateManager # State helper methods. Examples: # # @post.event! # send_event! :event # @post.active? # in_state? :active # @post.can_event? # respond_to_event? :event # module Helpers module Methods def self.define_methods(specification, target_class, property) self.define_methods_helper(specification, target_class, [], property) end def self.define_methods_helper(specification, target_class, name_parts, property) sm_proc = Proc.new do self.send "#{property}_manager" end specification.events.each do |name, event| target_class.send :define_method, "#{name.to_s}!" do | *args | state_manager = instance_eval &sm_proc state_manager.send_event! name, *args end target_class.send :define_method, "can_#{name.to_s}?" do state_manager = instance_eval &sm_proc state_manager.respond_to_event?(name) end end specification.states.each do |name, child_class| state_name_parts = name_parts.dup << name method = state_name_parts.join('_') path = state_name_parts.join('.') target_class.send :define_method, "#{method}?" do state_manager = instance_eval &sm_proc state_manager.in_state?(path) end define_methods_helper(child_class.specification, target_class, state_name_parts, property) end end end end end
Version data entries
18 entries across 18 versions & 1 rubygems