rules0.rb

config = Configuration.new config.add_item(Item.new(:secure_air_vent)) config.add_item(Item.new(:acid_bath)) config[:acid_bath].add_usage(Electricity.new(12)) acid = Acid.new config[:acid_bath].add_usage(acid) acid.type = :hcl acid.grade = 5 config.add_item(Item.new(:camera)) config[:camera].add_usage(Electricity.new(1)) config.add_item(Item.new(:small_power_plant)) config[:small_power_plant].add_provision(Electricity.new(11)) config[:small_power_plant].add_dependency(config[:secure_air_vent]) return config

rules1.rb

#using a 'reasonable' mix of method chaining and parameters item :secure_air_vent item(:acid_bath). uses(acid. type(:hcl). grade(5)). uses(electricity(12)) item(:camera).uses(electricity(1)) item(:small_power_plant). provides(electricity(11)). depends_on(:secure_air_vent)

rules2.rb

#using method chaining as much as reasonable ConfigurationBuilder. item(:secure_air_vent). item(:acid_bath). uses.acid. type(:hcl). grade(5). uses.electricity(12). item(:camera).uses.electricity(1). item(:small_power_plant). provides.electricity(11). depends_on(:secure_air_vent)

rules3.rb

# Using explicit receivers ConfigurationBuilder.start do |config| config.item :secure_air_vent config.item(:acid_bath) do |item| item.uses(Resources.acid) do |acid| acid.type = :hcl acid.grade = 5 end item.uses(Resources.electricity(12)) end config.item(:camera) do |item| item.uses(Resources.electricity(1)) end config.item(:small_power_plant) do |item| item.provides(Resources.electricity(11)) item.depends_on(:secure_air_vent) end end

rules4.rb

#Using hashes to encode most data but not going all the way item :secure_air_vent item :acid_bath, :uses => [acid(:type => :hcl, :grade => 5) , electricity(12)] item :camera, :uses => electricity(1) item :small_power_plant, :provides => electricity(11), :depends_on => :secure_air_vent

rules5.rb

#Using hash based literals to encode everything item :secure_air_vent item :acid_bath, :uses => [ [:acid, {:type => :hcl, :grade => 5}], [:electricity, 12] ] item :camera, :uses => [:electricity, 5] item :small_power_plant, :provides => [:electricity, 11], :depends_on => :secure_air_vent

rules6.rb

# using lists only. Greenspun would love this ;-) [ [:item, :secure_air_vent], [:item, :acid_bath, [:uses, [:acid, [:type, :hcl], [:grade, 5]], [:electricity, 12]]], [:item, :camera, [:uses, [:electricity, 5]]], [:item, :small_power_plant, [:provides, [:electricity, 11]], [:depends_on, :secure_air_vent]]] # interesting note here to rely on tail rather than more nested lists # eg use [:depends_on, :secure_air_vent, :something_else] rather than # [:depends_on, [:secure_air_vent, :something_else]]

rules7.rb

# using global functions with no identifiers item(:secure_air_vent) item(:acid_bath) uses(:acid_bath, acid(:acid_bath_acid)) acid_type(:acid_bath_acid, :hcl) acid_grade(:acid_bath_acid, 5) uses(:acid_bath, electricity(12)) item(:camera) uses(:camera, electricity(1)) item(:small_power_plant) provides(:small_power_plant, electricity(11)) depends(:small_power_plant, :secure_air_vent)

rules8.rb

#global functions again, but using parse state item(:secure_air_vent) item(:acid_bath) uses(acid) acid_type(:hcl) acid_grade(5) uses(electricity(12)) item(:camera) uses(electricity(1)) item(:small_power_plant) provides(electricity(11)) depends(:secure_air_vent)

rules9.rb

#global functions again eliminating all parens item :secure_air_vent item :acid_bath uses acid acid_type :hcl acid_grade 5 uses electricity electricity_power 12 item :camera uses electricity electricity_power 1 item :small_power_plant provides electricity electricity_power 11 depends :secure_air_vent

rules10.rb

# using a single method to introduce objects with method chaining load_configuration. item(:secure_air_vent). item(:acid_bath). uses.acid. type(:hcl). grade(5). uses.electricity(12). item(:camera).uses.electricity(1). item(:small_power_plant). provides.electricity(11). depends_on(:secure_air_vent)

rules11.rb

# Using class factories and method chaining Configuration.item(:secure_air_vent) Configuration.item(:acid_bath). uses(Resources.acid. set_type(:hcl). set_grade(5)). uses(Resources.electricity(12)) Configuration.item(:camera).uses(Resources.electricity(1)) Configuration.item(:small_power_plant). provides(Resources.electricity(11)). depends_on(:secure_air_vent) #maybe try multi-arg Configuration.load(Item.new.... Item.new...)

rules12.rb

# Using the same rules as case 11 but to be processed using expression # builder Configuration.item(:secure_air_vent) Configuration.item(:acid_bath). uses(Resources.acid. set_type(:hcl). set_grade(5)). uses(Resources.electricity(12)) Configuration.item(:camera).uses(Resources.electricity(1)) Configuration.item(:small_power_plant). provides(Resources.electricity(11)). depends_on(:secure_air_vent) #maybe try multi-arg Configuration.load(Item.new.... Item.new...)

rules13.rb

# using a single builder object with class methods and chaining ConfigurationBuilder. item(:secure_air_vent). item(:acid_bath). uses(Resources.acid. type(:hcl). grade(5)). uses(Resources.electricity(12)). item(:camera).uses(Resources.electricity(1)). item(:small_power_plant). provides(Resources.electricity(11)). depends_on(:secure_air_vent)

rules14.rb

# using an expression builder model with the same config code as 13 ConfigurationBuilder. item(:secure_air_vent). item(:acid_bath). uses(Resources.acid. type(:hcl). grade(5)). uses(Resources.electricity(12)). item(:camera).uses(Resources.electricity(1)). item(:small_power_plant). provides(Resources.electricity(11)). depends_on(:secure_air_vent)

rules15.rb

# using method chaining the same as case 2 but with a model expression # builder rather than a single object ConfigurationBuilder. item(:secure_air_vent). item(:acid_bath). uses.acid. type(:hcl). grade(5). uses.electricity(12). item(:camera).uses.electricity(1). item(:small_power_plant). provides.electricity(11). depends_on(:secure_air_vent)

rules16.rb

# taking the example from case 3 and doing it with temps instead of # closures config = ConfigurationBuilder.new config.item :secure_air_vent item = config.item(:acid_bath) acid = Resources.acid item.uses(acid) acid.type = :hcl acid.grade = 5 item.uses(Resources.electricity(12)) item = config.item(:camera) item.uses(Resources.electricity(1)) item = config.item(:small_power_plant) item.provides(Resources.electricity(11)) item.depends_on(:secure_air_vent)

rules17.rb

# Using subclass scoping and method chaining class PrimaryConfigurationRules < ConfigurationBuilder def run item(:secure_air_vent) item(:acid_bath). uses(acid. type(:hcl). grade(5)). uses(electricity(12)) item(:camera).uses(electricity(1)) item(:small_power_plant). provides(electricity(11)). depends_on(:secure_air_vent) end end

rules18.rb

# Using closures with instance_eval item :secure_air_vent item(:acid_bath) do uses(acid) do type :hcl grade 5 end uses(electricity(12)) end item(:camera) do uses(electricity(1)) end item(:small_power_plant) do provides(electricity(11)) depends_on(:secure_air_vent) end

rules19.rb

#using literal map for acid on a chaining base item :secure_air_vent item(:acid_bath). uses(acid(:type => :hcl, :grade => 5)). uses(electricity(12)) item(:camera).uses(electricity(1)) item(:small_power_plant). provides(electricity(11)). depends_on(:secure_air_vent)

rules20.rb

# Using map for acid on an instance_eval closure base item :secure_air_vent item(:acid_bath) do uses(acid(:type => :hcl, :grade => 5)) uses(electricity(12)) end item(:camera) do uses(electricity(1)) end item(:small_power_plant) do provides(electricity(11)) depends_on(:secure_air_vent) end

rules21.rb

#Using hashes to encode most data but not going all the way item :secure_air_vent item :acid_bath, [:uses, acid(:type => :hcl, :grade => 5), electricity(12)] item :camera, [:uses, electricity(1)] item :small_power_plant, [:provides, electricity(11)], [:depends_on, :secure_air_vent]

rules22.rb

#Using hash based literals to encode everything {:items => [ {:id => :secure_air_vent}, {:id => :acid_bath, :uses => [ [:acid, {:type => :hcl, :grade => 5}], [:electricity, 12]]}, {:id => :camera, :uses => [:electricity, 5]}, {:id => :small_power_plant, :provides => [:electricity, 11], :depends_on => :secure_air_vent} ]}