aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails_generator/manifest.rb
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-02-07 13:14:05 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-02-07 13:14:05 +0000
commitdaee6fd92ac16878f6806c3382a9e74592aa9656 (patch)
treed477c6502960cb141403f8b4640dd483b487e5df /railties/lib/rails_generator/manifest.rb
parent838c5a3d82367977d13ced01f9e28c22ccff32ef (diff)
downloadrails-daee6fd92ac16878f6806c3382a9e74592aa9656.tar.gz
rails-daee6fd92ac16878f6806c3382a9e74592aa9656.tar.bz2
rails-daee6fd92ac16878f6806c3382a9e74592aa9656.zip
Added new generator framework that informs about its doings on generation and enables updating and destruction of generated artifacts. See the new script/destroy and script/update for more details #487 [bitsweat]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@518 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'railties/lib/rails_generator/manifest.rb')
-rw-r--r--railties/lib/rails_generator/manifest.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/railties/lib/rails_generator/manifest.rb b/railties/lib/rails_generator/manifest.rb
new file mode 100644
index 0000000000..702effa76f
--- /dev/null
+++ b/railties/lib/rails_generator/manifest.rb
@@ -0,0 +1,53 @@
+module Rails
+ module Generator
+
+ # Manifest captures the actions a generator performs. Instantiate
+ # a manifest with an optional target object, hammer it with actions,
+ # then replay or rewind on the object of your choice.
+ #
+ # Example:
+ # manifest = Manifest.new { |m|
+ # m.make_directory '/foo'
+ # m.create_file '/foo/bar.txt'
+ # }
+ # manifest.replay(creator)
+ # manifest.rewind(destroyer)
+ class Manifest
+ attr_reader :target
+
+ # Take a default action target. Yield self if block given.
+ def initialize(target = nil)
+ @target, @actions = target, []
+ yield self if block_given?
+ end
+
+ # Record an action.
+ def method_missing(action, *args, &block)
+ @actions << [action, args, block]
+ end
+
+ # Replay recorded actions.
+ def replay(target = nil)
+ send_actions(target || @target, @actions)
+ end
+
+ # Rewind recorded actions.
+ def rewind(target = nil)
+ send_actions(target || @target, @actions.reverse)
+ end
+
+ # Erase recorded actions.
+ def erase
+ @actions = []
+ end
+
+ private
+ def send_actions(target, actions)
+ actions.each do |method, args, block|
+ target.send(method, *args, &block)
+ end
+ end
+ end
+
+ end
+end