Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Type
- attr_accessor :bs, :if_eval, :name
- def initialize(name, if_eval, &block)
- self.bs = []
- self.if_eval = method(if_eval)
- self.name = name
- instance_eval &block
- end
- def b &block
- bs << B.new(block)
- end
- def execute
- bs.each do |b|
- b.block.call
- end
- end
- end
- class B
- attr_accessor :block
- def initialize(block)
- self.block = block
- end
- def execute
- self.block.call
- end
- end
- @types = []
- def to(name, opts={}, &block)
- @types << Type.new(name, opts[:if], &block)
- end
- def is_a?(id)
- id == 'a'
- end
- def is_c?(id)
- id == 'c'
- end
- to 'a', if: :is_a? do
- b do
- puts 'A1'
- end
- b do
- puts 'A2'
- end
- end
- to 'c', if: :is_c? do
- b do
- puts 'C1'
- end
- b do
- puts 'C2'
- end
- end
- ['a', 'c', 'c'].each do |id|
- @types.each do |type|
- type.execute if type.if_eval.call(id)
- end
- end
- # Output:
- # A1
- # A2
- # C1
- # C2
- # C1
- # C2
Add Comment
Please, Sign In to add comment