lib/lou/transformer.rb in lou-0.2.3 vs lib/lou/transformer.rb in lou-0.3.0

- old
+ new

@@ -1,56 +1,65 @@ -require 'active_support/core_ext/class/attribute' require 'lou/transformer/step' module Lou module Transformer # never raise this... class NeverError < StandardError; end def self.extended(base) base.class_eval do - class_attribute :steps - self.steps = [] - class_attribute :error_class - self.error_class = Lou::Transformer::NeverError + self.transformer_steps = [] + self.transformer_error_class = Lou::Transformer::NeverError end end - def reverse_on(error) - self.error_class = error + def revert_on(error) + self.transformer_error_class = error end - def step - Step.new.tap do |t| - self.steps += [t] + def step(transformer) + transformer.tap do |t| + self.transformer_steps += [t] end end - def apply(input, total_steps = steps.count) + def up(&block) + Transformer::Step.new.up(&block) + end + + def down(&block) + Transformer::Step.new.down(&block) + end + + def apply(input, total_steps = transformer_steps.count) applied_steps = 0 begin - steps.last(total_steps).each do |t| + transformer_steps.last(total_steps).each do |t| input = t.apply(input) applied_steps += 1 end - rescue error_class => e - reverse(input, applied_steps) if total_steps == steps.count + rescue transformer_error_class => e + revert(input, applied_steps) if total_steps == transformer_steps.count raise e end input end - def reverse(output, total_steps = steps.count) + def revert(output, total_steps = transformer_steps.count) reversed_steps = 0 begin - steps.first(total_steps).reverse_each do |t| - output = t.reverse(output) + transformer_steps.first(total_steps).reverse_each do |t| + output = t.revert(output) reversed_steps += 1 end - rescue error_class => e - apply(output, reversed_steps) if total_steps == steps.count + rescue transformer_error_class => e + apply(output, reversed_steps) if total_steps == transformer_steps.count raise e end output end + + protected + + attr_accessor :transformer_steps, :transformer_error_class end end