arbre2 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +30 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +6 -0
  6. data/CHANGELOG.md +75 -0
  7. data/Gemfile +2 -0
  8. data/Gemfile.lock +93 -0
  9. data/LICENSE +20 -0
  10. data/README.md +92 -0
  11. data/Rakefile +7 -0
  12. data/arbre.gemspec +28 -0
  13. data/lib/arbre/child_element_collection.rb +86 -0
  14. data/lib/arbre/container.rb +20 -0
  15. data/lib/arbre/context.rb +83 -0
  16. data/lib/arbre/element/building.rb +151 -0
  17. data/lib/arbre/element.rb +194 -0
  18. data/lib/arbre/element_collection.rb +93 -0
  19. data/lib/arbre/html/attributes.rb +91 -0
  20. data/lib/arbre/html/class_list.rb +53 -0
  21. data/lib/arbre/html/comment.rb +47 -0
  22. data/lib/arbre/html/document.rb +93 -0
  23. data/lib/arbre/html/html_tags.rb +67 -0
  24. data/lib/arbre/html/querying.rb +256 -0
  25. data/lib/arbre/html/tag.rb +317 -0
  26. data/lib/arbre/rails/layouts.rb +126 -0
  27. data/lib/arbre/rails/legacy_document.rb +29 -0
  28. data/lib/arbre/rails/rendering.rb +76 -0
  29. data/lib/arbre/rails/rspec/arbre_support.rb +61 -0
  30. data/lib/arbre/rails/rspec.rb +2 -0
  31. data/lib/arbre/rails/template_handler.rb +32 -0
  32. data/lib/arbre/rails.rb +35 -0
  33. data/lib/arbre/rspec/be_rendered_as_matcher.rb +103 -0
  34. data/lib/arbre/rspec/be_scripted_as_matcher.rb +68 -0
  35. data/lib/arbre/rspec/contain_script_matcher.rb +64 -0
  36. data/lib/arbre/rspec.rb +3 -0
  37. data/lib/arbre/text_node.rb +35 -0
  38. data/lib/arbre/version.rb +3 -0
  39. data/lib/arbre.rb +27 -0
  40. data/spec/arbre/integration/html_document_spec.rb +90 -0
  41. data/spec/arbre/integration/html_spec.rb +283 -0
  42. data/spec/arbre/integration/querying_spec.rb +187 -0
  43. data/spec/arbre/integration/rails_spec.rb +183 -0
  44. data/spec/arbre/rails/rspec/arbre_support_spec.rb +75 -0
  45. data/spec/arbre/rspec/be_rendered_as_matcher_spec.rb +80 -0
  46. data/spec/arbre/rspec/be_scripted_as_matcher_spec.rb +61 -0
  47. data/spec/arbre/rspec/contain_script_matcher_spec.rb +40 -0
  48. data/spec/arbre/support/arbre_example_group.rb +0 -0
  49. data/spec/arbre/unit/child_element_collection_spec.rb +146 -0
  50. data/spec/arbre/unit/container_spec.rb +23 -0
  51. data/spec/arbre/unit/context_spec.rb +95 -0
  52. data/spec/arbre/unit/element/building_spec.rb +300 -0
  53. data/spec/arbre/unit/element_collection_spec.rb +169 -0
  54. data/spec/arbre/unit/element_spec.rb +297 -0
  55. data/spec/arbre/unit/html/attributes_spec.rb +219 -0
  56. data/spec/arbre/unit/html/class_list_spec.rb +109 -0
  57. data/spec/arbre/unit/html/comment_spec.rb +42 -0
  58. data/spec/arbre/unit/html/querying_spec.rb +32 -0
  59. data/spec/arbre/unit/html/tag_spec.rb +300 -0
  60. data/spec/arbre/unit/rails/layouts_spec.rb +127 -0
  61. data/spec/arbre/unit/text_node_spec.rb +40 -0
  62. data/spec/rails/app/controllers/example_controller.rb +18 -0
  63. data/spec/rails/app/views/example/_arbre_partial.html.arb +7 -0
  64. data/spec/rails/app/views/example/_erb_partial.html.erb +1 -0
  65. data/spec/rails/app/views/example/arbre.html.arb +1 -0
  66. data/spec/rails/app/views/example/arbre_partial_result.html.arb +3 -0
  67. data/spec/rails/app/views/example/erb.html.erb +5 -0
  68. data/spec/rails/app/views/example/erb_partial_result.html.arb +3 -0
  69. data/spec/rails/app/views/example/partials.html.arb +11 -0
  70. data/spec/rails/app/views/layouts/empty.html.arb +1 -0
  71. data/spec/rails/app/views/layouts/with_title.html.arb +5 -0
  72. data/spec/rails/config/routes.rb +4 -0
  73. data/spec/rails_spec_helper.rb +13 -0
  74. data/spec/spec_helper.rb +20 -0
  75. data/spec/support/arbre_example_group.rb +19 -0
  76. metadata +254 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e3f1ac910f763cbfdb4e8eb7d0c5a85ed3b51339
4
+ data.tar.gz: eb1d640364da931397040de5742e175b9be1f18d
5
+ SHA512:
6
+ metadata.gz: 8f9fa5ca0ffa00691b8ad49fe6ab47cea7cecd4d318e4e9241cac16a70e8925b42d5ab6dee9db9716a5597b0f0ec100ca22fc02d6f093d283e7a76609551161a
7
+ data.tar.gz: 45ae2671b9ae6f1d549ccbe2bf068af665fc0ba3a3297843ed3a1dd9ca7fa759f66531a40c78a0b35118fbb7e227d73179a14eea40cf5318fdaedd7a97739789
data/.gitignore ADDED
@@ -0,0 +1,30 @@
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile ~/.gitignore_global
6
+
7
+ # Ignore .DS_Store
8
+ .DS_Store
9
+
10
+ # Ignore the output files.
11
+ /pkg
12
+
13
+ # Ignore bundler and database config and precompiled assets
14
+ /.bundle
15
+ /.env
16
+
17
+ # Ignore all logfiles and tempfiles.
18
+ /tmp
19
+
20
+ # Ignore TextMate projects
21
+ *.tmproj
22
+ *.sublime-project
23
+ *.sublime-workspace
24
+
25
+ # Documentation files and other stuff
26
+ .yardoc
27
+ /doc
28
+ /nbproject
29
+ /coverage
30
+ /spec/rails/log
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ flux
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p247
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ script: bundle exec rake
2
+ rvm:
3
+ - 2.0.0
4
+ branches:
5
+ only:
6
+ - master
data/CHANGELOG.md ADDED
@@ -0,0 +1,75 @@
1
+ ## 2.1.0
2
+
3
+ * Added AJAX-rendering to `Arbre::Rails::LegacyDocument`
4
+ * Bug fix: classes specified in the class definition are not overwritten anymore by those passed to the
5
+ `build!` method.
6
+ * When using the `build!` method, any attributes that have a corresponding `<attribute>=` method on the
7
+ element class will cause this method to be invoked rather than the attributes array being updated.
8
+ * Bug fix: querying using multiple selectors now works (tag.find('a, button')).
9
+ * Bug fix using `render`: all child elements are now copied into the caller's element.
10
+ * Added public RSpec API.
11
+
12
+ ## 2.0.1
13
+
14
+ * Added `app/views/arbre` as autoload path when using Rails
15
+ * Added DSL methods `Arbre::Html::Tag.tag`, `Arbre::Html::Tag.tag_id` and `Arbre::Html::Tag.tag_classes`
16
+
17
+ ## 2.0.0
18
+
19
+ * Increased RSpec coverage to 100%
20
+ * Clear of specs failing when integrating into Flux framework
21
+
22
+ ## 2.0.0.rc2
23
+
24
+ * Support for symbolic classes
25
+ * Various fixes & spec upgrades after integration into Flux framework
26
+
27
+ ### Breaking changes
28
+
29
+ * Renaming `build` to `build!`
30
+ * Renaming `build_tag`/`build_element` to `build`
31
+ * Renaming `insert_tag`/`insert_element` to `insert`
32
+
33
+ ## 2.0.0.rc1
34
+
35
+ * Rails: added content-layout structure
36
+ * Rails: optimized template output handling, removed need for String masquerading
37
+ * Added querying
38
+ * Increased RSpec coverage to near 100%
39
+
40
+ ### Breaking changes
41
+
42
+ * Removal of `:for`-feature in tags
43
+ * Renamed `current_arbre_element` to `current_element`
44
+ * Renamed `Arbre::HTML` into `Arbre::Html`
45
+
46
+ *Joost Lubach*
47
+
48
+ ## 1.0.1
49
+
50
+ * Template handler converts to string to satisfy Rack::Lint (@jpmckinney, #6)
51
+ * Fix to `Tag#add_class` when passing a string of classes to Tag build method
52
+ (@gregbell, #7)
53
+ * Not longer uses the default separator (@LTe, #4)
54
+
55
+ ## 1.0.0
56
+
57
+ * Added support for the use of `:for` with non Active Model objects
58
+
59
+ ## 1.0.0.rc4
60
+
61
+ * Fix issue where user could call `symbolize_keys!` on a
62
+ HashWithIndifferentAccess which doesn't implement the method
63
+
64
+ ## 1.0.0.rc3
65
+
66
+ * Implemented `Arbre::Html::Tag#default_id_for_prefix`
67
+
68
+ ## 1.0.0.rc2
69
+
70
+ * Fixed bug where Component's build methods were being rendered within the
71
+ parent context.
72
+
73
+ ## 1.0.0.rc1
74
+
75
+ * Initial release and extraction from Active Admin
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,93 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ arbre2 (2.1.0)
5
+ activesupport (~> 3.2)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ actionpack (3.2.14)
11
+ activemodel (= 3.2.14)
12
+ activesupport (= 3.2.14)
13
+ builder (~> 3.0.0)
14
+ erubis (~> 2.7.0)
15
+ journey (~> 1.0.4)
16
+ rack (~> 1.4.5)
17
+ rack-cache (~> 1.2)
18
+ rack-test (~> 0.6.1)
19
+ sprockets (~> 2.2.1)
20
+ activemodel (3.2.14)
21
+ activesupport (= 3.2.14)
22
+ builder (~> 3.0.0)
23
+ activesupport (3.2.14)
24
+ i18n (~> 0.6, >= 0.6.4)
25
+ multi_json (~> 1.0)
26
+ atomic (1.1.14)
27
+ builder (3.0.4)
28
+ combustion (0.5.1)
29
+ activesupport (>= 3.0.0)
30
+ railties (>= 3.0.0)
31
+ thor (>= 0.14.6)
32
+ diff-lcs (1.2.5)
33
+ erubis (2.7.0)
34
+ hike (1.2.3)
35
+ i18n (0.6.9)
36
+ journey (1.0.4)
37
+ json (1.8.1)
38
+ multi_json (1.8.2)
39
+ rack (1.4.5)
40
+ rack-cache (1.2)
41
+ rack (>= 0.4)
42
+ rack-ssl (1.3.3)
43
+ rack
44
+ rack-test (0.6.2)
45
+ rack (>= 1.0)
46
+ railties (3.2.14)
47
+ actionpack (= 3.2.14)
48
+ activesupport (= 3.2.14)
49
+ rack-ssl (~> 1.3.2)
50
+ rake (>= 0.8.7)
51
+ rdoc (~> 3.4)
52
+ thor (>= 0.14.6, < 2.0)
53
+ rake (10.1.0)
54
+ rdoc (3.12.2)
55
+ json (~> 1.4)
56
+ rspec-core (2.14.7)
57
+ rspec-expectations (2.14.4)
58
+ diff-lcs (>= 1.1.3, < 2.0)
59
+ rspec-mocks (2.14.4)
60
+ rspec-rails (2.14.0)
61
+ actionpack (>= 3.0)
62
+ activesupport (>= 3.0)
63
+ railties (>= 3.0)
64
+ rspec-core (~> 2.14.0)
65
+ rspec-expectations (~> 2.14.0)
66
+ rspec-mocks (~> 2.14.0)
67
+ simplecov (0.7.1)
68
+ multi_json (~> 1.0)
69
+ simplecov-html (~> 0.7.1)
70
+ simplecov-html (0.7.1)
71
+ sprockets (2.2.2)
72
+ hike (~> 1.2)
73
+ multi_json (~> 1.0)
74
+ rack (~> 1.0)
75
+ tilt (~> 1.1, != 1.3.0)
76
+ thor (0.18.1)
77
+ thread_safe (0.1.3)
78
+ atomic
79
+ tilt (1.4.1)
80
+ tzinfo (1.1.0)
81
+ thread_safe (~> 0.1)
82
+
83
+ PLATFORMS
84
+ ruby
85
+
86
+ DEPENDENCIES
87
+ arbre2!
88
+ bundler (~> 1.3)
89
+ combustion (~> 0.5)
90
+ rake
91
+ rspec-rails (~> 2.14)
92
+ simplecov
93
+ tzinfo
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Greg Bell
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # Arbre - Ruby Object Oriented HTML Views
2
+
3
+ Arbre is the DOM implemented in Ruby. This project is primarily used as
4
+ the object oriented view layer in Active Admin.
5
+
6
+ [<img src="https://secure.travis-ci.org/yoazt/arbre.png?branch=master" alt="Build Status" />](http://travis-ci.org/yoazt/arbre)
7
+
8
+ ## Simple Usage
9
+
10
+ A simple example of setting up an Arbre context and creating some html
11
+
12
+ html = Arbre::Context.new do
13
+ h2 "Why Arbre is awesome?"
14
+
15
+ ul do
16
+ li "The DOM is implemented in ruby"
17
+ li "You can create object oriented views"
18
+ li "Templates suck"
19
+ end
20
+ end
21
+
22
+ puts html.to_s #=> <h2>Why</h2><ul><li></li></ul>
23
+
24
+
25
+ ## The DOM in Ruby
26
+
27
+ The purpose of Arbre is to leave the view as ruby objects as long
28
+ as possible. This allows OO Design to be used to implement the view layer.
29
+
30
+
31
+ html = Arbre::Context.new do
32
+ h2 "Why Arbre is awesome?"
33
+ end
34
+
35
+ html.children.size #=> 1
36
+ html.children.first #=> #<Arbre::Html::H2>
37
+
38
+ It is easy to extend your DOM tree as well.
39
+
40
+ arbre = Arbre::Context.new do
41
+ h2 "Why Arbre is awesome?"
42
+
43
+ ul do
44
+ li "The DOM is implemented in ruby"
45
+ li "You can create object oriented views"
46
+ end
47
+
48
+ within 'ul' do
49
+ li "Templates suck"
50
+ end
51
+ before 'li:last' do
52
+ li "I forgot:"
53
+ end
54
+ end
55
+
56
+ ## Custom elements
57
+
58
+ The purpose of Arbre is to be able to create shareable and extendable HTML
59
+ elements. To do this, you create a subclass of any Arbre HTML element:
60
+
61
+ For example:
62
+
63
+ class Panel < Arbre::Html::Section
64
+ builder_method :panel
65
+
66
+ def build!(title, attributes = {})
67
+ super attributes
68
+
69
+ h3 title, class: "panel-title"
70
+ end
71
+ end
72
+
73
+ The `builder_method` defines the method that will be called to build this component
74
+ when using the DSL. The arguments passed into the `builder_method` will be passed
75
+ into the `#build!` method for you.
76
+
77
+ You can now use this panel in any Arbre context:
78
+
79
+ html = Arbre::Context.new do
80
+ panel "Hello World", id: "my-panel" do
81
+ span "Inside the panel"
82
+
83
+ after('h3') { sub "This is inserted after the title." }
84
+ end
85
+ end
86
+
87
+ html.to_s #=>
88
+ # <div class='panel' id="my-panel">
89
+ # <h3 class='panel-title'>Hello World</h3>
90
+ # <sub>This is inserted after the title.</sub>
91
+ # <span>Inside the panel</span>
92
+ # </div>
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
data/arbre.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "arbre/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "arbre2"
7
+ s.version = Arbre::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Greg Bell", "Joost Lubach"]
10
+ s.email = ["gregdbell@gmail.com", "joostlubach@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{An Object Oriented DOM Tree in Ruby}
13
+ s.description = %q{An Object Oriented DOM Tree in Ruby}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency "activesupport", "~> 3.2"
21
+
22
+ s.add_development_dependency "bundler", "~> 1.3"
23
+ s.add_development_dependency "rake"
24
+ s.add_development_dependency "tzinfo"
25
+ s.add_development_dependency "combustion", "~> 0.5"
26
+ s.add_development_dependency "rspec-rails", "~> 2.14"
27
+ s.add_development_dependency "simplecov"
28
+ end
@@ -0,0 +1,86 @@
1
+ module Arbre
2
+
3
+ # An element collection used to hold some other element's children. Adds functionality to
4
+ # update a child's parent when it is added, and supports inserting at specific positions
5
+ # in the collection.
6
+ class ChildElementCollection < ElementCollection
7
+
8
+ ######
9
+ # Initialization
10
+
11
+ def initialize(parent)
12
+ super([])
13
+ @parent = parent
14
+ end
15
+
16
+ attr_reader :parent
17
+
18
+ ######
19
+ # Equality
20
+
21
+ def eql?(other)
22
+ super && parent == other.parent
23
+ end
24
+
25
+ ######
26
+ # Adding and removing
27
+
28
+ def add(element)
29
+ insert_at length, element
30
+ end
31
+
32
+ def remove(element)
33
+ return unless include?(element)
34
+
35
+ element.parent = nil
36
+ @elements.delete element
37
+ end
38
+
39
+ def clear
40
+ @elements.each { |element| element.parent = nil }
41
+ super
42
+ end
43
+
44
+ ######
45
+ # Inserting
46
+
47
+ def insert_at(index, element)
48
+ if include?(element)
49
+ index -= 1 if @elements.index(element) <= index
50
+ @elements.delete element
51
+ else
52
+ assign_to_parent element
53
+ end
54
+ @elements.insert index, element
55
+ self
56
+ end
57
+
58
+ def insert_after(existing, element)
59
+ index = @elements.index(existing) or
60
+ raise ArgumentError, "existing element #{existing} not found"
61
+
62
+ insert_at index+1, element
63
+ end
64
+
65
+ def insert_before(existing, element)
66
+ index = @elements.index(existing) or
67
+ raise ArgumentError, "existing element #{existing} not found"
68
+
69
+ insert_at index, element
70
+ end
71
+
72
+ ######
73
+ # Parent
74
+
75
+ private
76
+
77
+ # Assigns the element to the parent of this collection, and removes it from the
78
+ # children of its current parent.
79
+ def assign_to_parent(element)
80
+ element.remove!
81
+ element.parent = parent
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,20 @@
1
+ module Arbre
2
+
3
+ # This element is a simple container for children. When rendered, it will
4
+ # simply render the children, making this element 'invisible'. Use this
5
+ # class as a placeholder.
6
+ class Container < Element
7
+ def to_s
8
+ content
9
+ end
10
+
11
+ def indent_level
12
+ if parent
13
+ parent.indent_level
14
+ else
15
+ 0
16
+ end
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,83 @@
1
+ require 'arbre/element'
2
+ require 'active_support/core_ext/hash/keys'
3
+
4
+ module Arbre
5
+
6
+ # Root of any Arbre construct. Each elements in any Arbre construct will have a reference
7
+ # to this context, which provides information like what the current arbre element is.
8
+ class Context < Container
9
+
10
+ ######
11
+ # Initialization
12
+
13
+ # Initialize a new Arbre::Context. Any passed block will be instance-exec'd.
14
+ #
15
+ # @param [Hash] assigns
16
+ # A hash of objects which will be made available as instance variables in the context,
17
+ # and in some Arbre elements.
18
+ #
19
+ # @param [Object] helpers
20
+ # An object that has methods on it which will become instance methods within the context.
21
+ # In a Rails set up, this is typically the +ActionView::Base+ instance used to render the
22
+ # view.
23
+ def initialize(assigns = nil, helpers = nil, &block)
24
+ @_assigns = (assigns || {}).symbolize_keys
25
+ @_helpers = helpers
26
+ @_element_stack = [ self ]
27
+ @_flow_stack = [ :append ]
28
+
29
+ # Pass ourselves as the arbre context to the element.
30
+ super self
31
+
32
+ instance_exec &block if block_given?
33
+ end
34
+
35
+ ######
36
+ # Attributes
37
+
38
+ def assigns
39
+ @_assigns
40
+ end
41
+
42
+ def helpers
43
+ @_helpers
44
+ end
45
+
46
+ def parent=(*)
47
+ raise NotImplementedError, "Arbre::Context cannot have a parent"
48
+ end
49
+
50
+ def indent_level
51
+ -1
52
+ end
53
+
54
+ ######
55
+ # Element & flow stack
56
+
57
+ def current_element
58
+ @_element_stack.last
59
+ end
60
+
61
+ def current_flow
62
+ @_flow_stack.last
63
+ end
64
+
65
+ def with_current(element: nil, flow: :append)
66
+ raise ArgumentError, "can't be in the context of nil" unless element
67
+
68
+ @_element_stack.push element
69
+ @_flow_stack.push flow
70
+ yield if block_given?
71
+ ensure
72
+ @_flow_stack.pop
73
+ @_element_stack.pop
74
+ end
75
+
76
+ # Replaces the current flow. For internal usie!
77
+ def replace_current_flow(flow)
78
+ @_flow_stack.pop
79
+ @_flow_stack.push flow
80
+ end
81
+
82
+ end
83
+ end