Class | StateMachine::ConditionProxy |
In: |
lib/state_machine/condition_proxy.rb
|
Parent: | Module |
Represents a type of module in which class-level methods are proxied to another class, injecting a custom :if condition along with method.
This is used for being able to automatically include conditionals which check the current state in class-level methods that have configuration options.
class Vehicle class << self attr_accessor :validations def validate(options, &block) validations << options end end self.validations = [] attr_accessor :state, :simulate def moving? self.class.validations.all? {|validation| validation[:if].call(self)} end end
In the above class, a simple set of validation behaviors have been defined. Each validation consists of a configuration like so:
Vehicle.validate :unless => :simulate Vehicle.validate :if => lambda {|vehicle| ...}
In order to scope conditions, a condition proxy can be created to the Vehicle class. For example,
proxy = StateMachine::ConditionProxy.new(Vehicle, lambda {|vehicle| vehicle.state == 'first_gear'}) proxy.validate(:unless => :simulate) vehicle = Vehicle.new # => #<Vehicle:0xb7ce491c @simulate=nil, @state=nil> vehicle.moving? # => false vehicle.state = 'first_gear' vehicle.moving? # => true vehicle.simulate = true vehicle.moving? # => false