class Ellington::Route

Attributes

initialized[R]

Public Class Methods

board(passenger) click to toggle source
# File lib/ellington/route.rb, line 51
def board(passenger)
  lines.first.board passenger
end
connect(line, after: [], strict: false) click to toggle source
# File lib/ellington/route.rb, line 96
def connect(line, after: [], strict: false)
  connections << Ellington::Connection.new(line, *after, strict: false)
end
connections() click to toggle source
# File lib/ellington/route.rb, line 92
def connections
  @connections ||= Ellington::ConnectionList.new
end
goal(*line_goals)
Alias for: pass_target
inherited(subclass) click to toggle source
# File lib/ellington/route.rb, line 43
def inherited(subclass)
  (@subclasses ||= []) << subclass
end
initial_state() click to toggle source
# File lib/ellington/route.rb, line 82
def initial_state
  @initial_state ||= "PRE #{name}"
end
initialized?() click to toggle source
# File lib/ellington/route.rb, line 47
def initialized?
  @initialized
end
line_completed(line_info) click to toggle source
# File lib/ellington/route.rb, line 108
def line_completed(line_info)
  route_info = Ellington::RouteInfo.new(self, line_info)
  connections = required_connections(route_info.passenger)
  return complete_route(route_info) if connections.empty?
  connections.each do |connection|
    connection.line.board route_info.passenger
  end
end
lines() click to toggle source
# File lib/ellington/route.rb, line 55
def lines
  @lines ||= Ellington::LineList.new(self)
end
new() click to toggle source
Calls superclass method
# File lib/ellington/route.rb, line 10
def initialize
  super self.class

  if lines.empty?
    message = "#{self.class.name} has no lines!"
    raise Ellington::NoLinesDeclared.new(message)
  end

  if goal.empty?
    message = "#{self.class.name} has no lines!"
    raise Ellington::NoGoalDeclared.new(message)
  end

  initialize_lines
  states
end
pass_target(*line_goals) click to toggle source
# File lib/ellington/route.rb, line 86
def pass_target(*line_goals)
  @goal ||= Ellington::Target.new(*line_goals.flatten)
end
Also aliased as: passed, goal
passed(*line_goals)
Alias for: pass_target
passenger_attrs_to_log() click to toggle source
# File lib/ellington/route.rb, line 100
def passenger_attrs_to_log
  @passenger_attrs_to_log ||= []
end
set_passenger_attrs_to_log(*attrs) click to toggle source
# File lib/ellington/route.rb, line 104
def set_passenger_attrs_to_log(*attrs)
  @passenger_attrs_to_log = attrs
end
states() click to toggle source
# File lib/ellington/route.rb, line 59
def states
  @states ||= begin
    catalog = StateJacket::Catalog.new
    catalog.add initial_state => lines.first.stations.first.states.keys

    lines.each do |line|
      line.states.each do |state, transitions|
        catalog[state] = transitions.nil? ? nil : transitions.dup
      end
    end

    connections.each do |connection|
      connection.states.each do |state|
        catalog[state] ||= []
        catalog[state].concat connection.line.stations.first.states.keys
      end
    end

    catalog.lock
    catalog
  end
end

Protected Class Methods

complete_route(route_info) click to toggle source
# File lib/ellington/route.rb, line 119
def complete_route(route_info)
  if passed.satisfied?(route_info.passenger) || failed.satisfied?(route_info.passenger)
    log route_info.route_completed_message
    changed
    notify_observers route_info
  end
end
log(message) click to toggle source
# File lib/ellington/route.rb, line 133
def log(message)
  return unless Ellington.logger
  Ellington.logger.info message
end
required_connections(passenger) click to toggle source
# File lib/ellington/route.rb, line 127
def required_connections(passenger)
  connections.select do |connection|
    connection.required?(passenger)
  end
end

Public Instance Methods

initialize_lines() click to toggle source
# File lib/ellington/route.rb, line 27
def initialize_lines
  lines.each do |line|
    line.route = self
    line.add_observer self, :line_completed
    line.stations.each do |station|
      station.line = line
      station.add_observer line, :station_completed
    end
  end
end