# File lib/state_machine/machine.rb, line 418
    def initialize(owner_class, *args, &block)
      options = args.last.is_a?(Hash) ? args.pop : {}
      assert_valid_keys(options, :attribute, :initial, :initialize, :action, :plural, :namespace, :integration, :messages, :use_transactions)
      
      # Find an integration that matches this machine's owner class
      if options.include?(:integration)
        @integration = StateMachine::Integrations.find_by_name(options[:integration]) if options[:integration]
      else
        @integration = StateMachine::Integrations.match(owner_class)
      end
      
      if @integration
        extend @integration
        options = (@integration.defaults || {}).merge(options)
      end
      
      # Add machine-wide defaults
      options = {:use_transactions => true, :initialize => true}.merge(options)
      
      # Set machine configuration
      @name = args.first || :state
      @attribute = options[:attribute] || @name
      @events = EventCollection.new(self)
      @states = StateCollection.new(self)
      @callbacks = {:before => [], :after => [], :failure => []}
      @namespace = options[:namespace]
      @messages = options[:messages] || {}
      @action = options[:action]
      @use_transactions = options[:use_transactions]
      @initialize_state = options[:initialize]
      self.owner_class = owner_class
      self.initial_state = options[:initial] unless owner_class.state_machines.any? {|name, machine| machine.attribute == attribute && machine != self}
      
      # Define class integration
      define_helpers
      define_scopes(options[:plural])
      after_initialize
      
      # Evaluate DSL
      instance_eval(&block) if block_given?
    end