Renamed helpers to correspond to renamed Controller classes.
[merb_radiant.git] / radiant_extensions_plugins / plugins / scenarios / lib / scenarios / .svn / text-base / configuration.rb.svn-base
blob6becffcfec06830049378f1c50d12df6b609ce2e
1 module Scenarios
2   class Configuration # :nodoc:
3     attr_reader :blasted_tables, :loaded_scenarios, :record_metas, :table_readers, :scenario_helpers, :symbolic_names_to_id
4     
5     def initialize
6       @blasted_tables       = Set.new
7       @record_metas         = Hash.new
8       @table_readers        = Module.new
9       @scenario_helpers     = Module.new
10       @symbolic_names_to_id = Hash.new {|h,k| h[k] = Hash.new}
11       @loaded_scenarios     = Array.new
12     end
13     
14     # Given a created record (currently ScenarioModel or ScenarioRecord),
15     # update the table readers module appropriately such that this record and
16     # it's id are findable via methods like 'people(symbolic_name)' and
17     # 'person_id(symbolic_name)'.
18     def update_table_readers(record)
19       ids, record_meta = symbolic_names_to_id, record.record_meta # scoping assignments
20       
21       ids[record_meta.table_name][record.symbolic_name] = record.id
22       table_readers.send :define_method, record_meta.id_reader do |*symbolic_names|
23         record_ids = symbolic_names.flatten.collect do |symbolic_name|
24           if symbolic_name.kind_of?(ActiveRecord::Base)
25             symbolic_name.id
26           else
27             record_id = ids[record_meta.table_name][symbolic_name.to_sym]
28             raise ActiveRecord::RecordNotFound, "No object is associated with #{record_meta.table_name}(:#{symbolic_name})" unless record_id
29             record_id
30           end
31         end
32         record_ids.size > 1 ? record_ids : record_ids.first
33       end
34       
35       table_readers.send :define_method, record_meta.record_reader do |*symbolic_names|
36         results = symbolic_names.flatten.collect do |symbolic_name|
37           symbolic_name.kind_of?(ActiveRecord::Base) ?
38             symbolic_name :
39             record_meta.record_class.find(send(record_meta.id_reader, symbolic_name))
40         end
41         results.size > 1 ? results : results.first
42       end
43     end
44     
45     def update_scenario_helpers(scenario_class)
46       scenario_helpers.module_eval do
47         include scenario_class.helpers
48       end
49     end
50     
51     def scenarios_loaded?
52       !loaded_scenarios.blank?
53     end
54   end
55 end