= Watchmaker

Build complex objects easily for use in integration tests.

== Motivation

Extract complex setup code for integration tests out into a central
place; for example: 

* Share setup code between cucumber and test/unit by centralizing it.
* Run this code in the console in development mode to seed your db with test data.

== Using

=== Define profiles

Specify car, garage and boat as a dependency for lots of things.  Watchmaker 
will either use a watchmaker by that name to fulfill that dependency, or fall 
back to the factory if it doesn't exist.

  Watchmaker.define :lots_of_things => [:car, :garage, :boat] 

Specify a block with things to do do:

    Watchmaker.define :two_garages do
      2.times do 
        Factory.create :garage
      end
    end

Specify a factory as a dependency:

    Watchmaker.define :garage, :factories => [:garage] do
      # Some other post-factory creation setup here.
    end

Specify multiple factories as dependencies: 

    Watchmaker.define :garages, :factories => [:garage, :garage] do
      # Some other post-factory creation setup here.
    end

Pass those objects in to the block:

    Watchmaker.define :car_and_driver, :factories => [:garage, :car] do |garage, car|
      garage.cars << car
    end

Sepcify another watchmaker as a dependency:

    Watchmaker.define :car, :watchmakers => [:garage]

Specify a factory and a watchmaker as a dependency:

    Watchmaker.define :car, :factories => [:car], :watchmakers => [:garage]

=== Manufacture objects

Build in-memory objects using the two garages profile.

    Watchmaker.build :two_garages

Build persisted objects using the two garages profile.

    Watchmaker.create :two_garages

==== Get your objects back

Watchmaker returns the objects created.

    Watchmaker.create(:garage).first.class # Garage

== Inspiration for the name

William Paley's {Watchmaker Analogy and Argument}[http://en.wikipedia.org/wiki/Watchmaker_analogy#The_Watchmaker_argument].

== License

Watchmaker is Copyright © 2011 Christopher Meiklejohn.  It is free software, and may be redistributed under the terms specified in the LICENSE file.

== About

The watchmaker gem was written by {Christopher Meiklejohn}[mailto:cmeiklejohn@swipely.com] from {Swipely, Inc.}[http://www.swipely.com].