ramaze 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. data/Rakefile +360 -0
  2. data/bin/ramaze +152 -0
  3. data/doc/CHANGELOG +2021 -0
  4. data/doc/COPYING +56 -0
  5. data/doc/COPYING.ja +51 -0
  6. data/doc/README +275 -0
  7. data/doc/TODO +33 -0
  8. data/doc/allison/LICENSE +184 -0
  9. data/doc/allison/README +37 -0
  10. data/doc/allison/allison.css +300 -0
  11. data/doc/allison/allison.gif +0 -0
  12. data/doc/allison/allison.js +307 -0
  13. data/doc/allison/allison.rb +287 -0
  14. data/doc/allison/cache/BODY +588 -0
  15. data/doc/allison/cache/CLASS_INDEX +4 -0
  16. data/doc/allison/cache/CLASS_PAGE +1 -0
  17. data/doc/allison/cache/FILE_INDEX +4 -0
  18. data/doc/allison/cache/FILE_PAGE +1 -0
  19. data/doc/allison/cache/FONTS +1 -0
  20. data/doc/allison/cache/FR_INDEX_BODY +1 -0
  21. data/doc/allison/cache/IMGPATH +1 -0
  22. data/doc/allison/cache/INDEX +1 -0
  23. data/doc/allison/cache/JAVASCRIPT +307 -0
  24. data/doc/allison/cache/METHOD_INDEX +4 -0
  25. data/doc/allison/cache/METHOD_LIST +1 -0
  26. data/doc/allison/cache/SRC_PAGE +1 -0
  27. data/doc/allison/cache/STYLE +322 -0
  28. data/doc/allison/cache/URL +1 -0
  29. data/examples/blog/main.rb +16 -0
  30. data/examples/blog/public/screen.css +106 -0
  31. data/examples/blog/src/controller.rb +50 -0
  32. data/examples/blog/src/element.rb +53 -0
  33. data/examples/blog/src/model.rb +29 -0
  34. data/examples/blog/template/edit.xhtml +6 -0
  35. data/examples/blog/template/index.xhtml +24 -0
  36. data/examples/blog/template/new.xhtml +5 -0
  37. data/examples/blog/template/view.xhtml +15 -0
  38. data/examples/blog/test/tc_entry.rb +18 -0
  39. data/examples/caching.rb +23 -0
  40. data/examples/element.rb +40 -0
  41. data/examples/hello.rb +23 -0
  42. data/examples/simple.rb +60 -0
  43. data/examples/templates/template/external.haml +21 -0
  44. data/examples/templates/template/external.liquid +28 -0
  45. data/examples/templates/template/external.mab +27 -0
  46. data/examples/templates/template/external.rhtml +29 -0
  47. data/examples/templates/template/external.rmze +24 -0
  48. data/examples/templates/template_erubis.rb +50 -0
  49. data/examples/templates/template_haml.rb +48 -0
  50. data/examples/templates/template_liquid.rb +64 -0
  51. data/examples/templates/template_markaby.rb +52 -0
  52. data/examples/templates/template_ramaze.rb +49 -0
  53. data/examples/whywiki/main.rb +56 -0
  54. data/examples/whywiki/template/edit.xhtml +14 -0
  55. data/examples/whywiki/template/show.xhtml +17 -0
  56. data/lib/proto/conf/benchmark.yaml +35 -0
  57. data/lib/proto/conf/debug.yaml +34 -0
  58. data/lib/proto/conf/live.yaml +33 -0
  59. data/lib/proto/conf/silent.yaml +31 -0
  60. data/lib/proto/conf/stage.yaml +33 -0
  61. data/lib/proto/main.rb +18 -0
  62. data/lib/proto/public/404.jpg +0 -0
  63. data/lib/proto/public/css/coderay.css +105 -0
  64. data/lib/proto/public/css/ramaze_error.css +42 -0
  65. data/lib/proto/public/error.xhtml +74 -0
  66. data/lib/proto/public/favicon.ico +0 -0
  67. data/lib/proto/public/js/jquery.js +1923 -0
  68. data/lib/proto/public/ramaze.png +0 -0
  69. data/lib/proto/src/controller/main.rb +7 -0
  70. data/lib/proto/src/element/page.rb +16 -0
  71. data/lib/proto/src/model.rb +5 -0
  72. data/lib/proto/template/index.xhtml +6 -0
  73. data/lib/ramaze.rb +317 -0
  74. data/lib/ramaze/adapter/mongrel.rb +111 -0
  75. data/lib/ramaze/adapter/webrick.rb +161 -0
  76. data/lib/ramaze/cache.rb +11 -0
  77. data/lib/ramaze/cache/memcached.rb +52 -0
  78. data/lib/ramaze/cache/memory.rb +6 -0
  79. data/lib/ramaze/cache/yaml_store.rb +37 -0
  80. data/lib/ramaze/controller.rb +10 -0
  81. data/lib/ramaze/dispatcher.rb +315 -0
  82. data/lib/ramaze/error.rb +11 -0
  83. data/lib/ramaze/gestalt.rb +108 -0
  84. data/lib/ramaze/global.rb +120 -0
  85. data/lib/ramaze/helper.rb +32 -0
  86. data/lib/ramaze/helper/aspect.rb +189 -0
  87. data/lib/ramaze/helper/auth.rb +120 -0
  88. data/lib/ramaze/helper/cache.rb +52 -0
  89. data/lib/ramaze/helper/feed.rb +135 -0
  90. data/lib/ramaze/helper/form.rb +204 -0
  91. data/lib/ramaze/helper/link.rb +80 -0
  92. data/lib/ramaze/helper/redirect.rb +48 -0
  93. data/lib/ramaze/helper/stack.rb +67 -0
  94. data/lib/ramaze/http_status.rb +66 -0
  95. data/lib/ramaze/inform.rb +166 -0
  96. data/lib/ramaze/snippets.rb +5 -0
  97. data/lib/ramaze/snippets/hash/keys_to_sym.rb +19 -0
  98. data/lib/ramaze/snippets/kernel/aquire.rb +22 -0
  99. data/lib/ramaze/snippets/kernel/autoreload.rb +79 -0
  100. data/lib/ramaze/snippets/kernel/caller_lines.rb +58 -0
  101. data/lib/ramaze/snippets/kernel/constant.rb +24 -0
  102. data/lib/ramaze/snippets/kernel/rescue_require.rb +12 -0
  103. data/lib/ramaze/snippets/kernel/self_method.rb +41 -0
  104. data/lib/ramaze/snippets/kernel/silently.rb +13 -0
  105. data/lib/ramaze/snippets/object/traits.rb +60 -0
  106. data/lib/ramaze/snippets/openstruct/temp.rb +10 -0
  107. data/lib/ramaze/snippets/string/DIVIDE.rb +16 -0
  108. data/lib/ramaze/snippets/string/camel_case.rb +14 -0
  109. data/lib/ramaze/snippets/string/snake_case.rb +12 -0
  110. data/lib/ramaze/snippets/symbol/to_proc.rb +14 -0
  111. data/lib/ramaze/snippets/thread/deadQUESTIONMARK.rb +11 -0
  112. data/lib/ramaze/store/default.rb +48 -0
  113. data/lib/ramaze/template.rb +102 -0
  114. data/lib/ramaze/template/amrita2.rb +40 -0
  115. data/lib/ramaze/template/erubis.rb +58 -0
  116. data/lib/ramaze/template/haml.rb +65 -0
  117. data/lib/ramaze/template/haml/actionview_stub.rb +20 -0
  118. data/lib/ramaze/template/liquid.rb +74 -0
  119. data/lib/ramaze/template/markaby.rb +68 -0
  120. data/lib/ramaze/template/ramaze.rb +177 -0
  121. data/lib/ramaze/template/ramaze/element.rb +166 -0
  122. data/lib/ramaze/template/ramaze/morpher.rb +156 -0
  123. data/lib/ramaze/tool/create.rb +70 -0
  124. data/lib/ramaze/tool/tidy.rb +71 -0
  125. data/lib/ramaze/trinity.rb +38 -0
  126. data/lib/ramaze/trinity/request.rb +244 -0
  127. data/lib/ramaze/trinity/response.rb +41 -0
  128. data/lib/ramaze/trinity/session.rb +129 -0
  129. data/lib/ramaze/version.rb +14 -0
  130. data/spec/spec_all.rb +73 -0
  131. data/spec/spec_helper.rb +215 -0
  132. data/spec/tc_adapter_mongrel.rb +24 -0
  133. data/spec/tc_adapter_webrick.rb +22 -0
  134. data/spec/tc_cache.rb +79 -0
  135. data/spec/tc_controller.rb +39 -0
  136. data/spec/tc_element.rb +100 -0
  137. data/spec/tc_error.rb +23 -0
  138. data/spec/tc_gestalt.rb +90 -0
  139. data/spec/tc_global.rb +46 -0
  140. data/spec/tc_helper_aspect.rb +65 -0
  141. data/spec/tc_helper_auth.rb +61 -0
  142. data/spec/tc_helper_cache.rb +81 -0
  143. data/spec/tc_helper_feed.rb +129 -0
  144. data/spec/tc_helper_form.rb +146 -0
  145. data/spec/tc_helper_link.rb +58 -0
  146. data/spec/tc_helper_redirect.rb +51 -0
  147. data/spec/tc_helper_stack.rb +55 -0
  148. data/spec/tc_morpher.rb +90 -0
  149. data/spec/tc_params.rb +84 -0
  150. data/spec/tc_request.rb +111 -0
  151. data/spec/tc_session.rb +56 -0
  152. data/spec/tc_store.rb +25 -0
  153. data/spec/tc_template_amrita2.rb +34 -0
  154. data/spec/tc_template_erubis.rb +41 -0
  155. data/spec/tc_template_haml.rb +44 -0
  156. data/spec/tc_template_liquid.rb +98 -0
  157. data/spec/tc_template_markaby.rb +74 -0
  158. data/spec/tc_template_ramaze.rb +54 -0
  159. data/spec/tc_tidy.rb +14 -0
  160. data/spec/template/amrita2/data.html +6 -0
  161. data/spec/template/amrita2/index.html +1 -0
  162. data/spec/template/amrita2/sum.html +1 -0
  163. data/spec/template/erubis/sum.rhtml +1 -0
  164. data/spec/template/haml/index.haml +5 -0
  165. data/spec/template/haml/with_vars.haml +4 -0
  166. data/spec/template/liquid/index.liquid +1 -0
  167. data/spec/template/liquid/products.liquid +45 -0
  168. data/spec/template/markaby/external.mab +8 -0
  169. data/spec/template/markaby/sum.mab +1 -0
  170. data/spec/template/ramaze/file_only.rmze +1 -0
  171. data/spec/template/ramaze/index.rmze +1 -0
  172. data/spec/template/ramaze/nested.rmze +1 -0
  173. data/spec/template/ramaze/sum.rmze +1 -0
  174. metadata +317 -0
@@ -0,0 +1,11 @@
1
+ # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ module Ramaze
5
+ module Error
6
+ class NoAction < StandardError; end
7
+ class NoController < StandardError; end
8
+ class WrongParameterCount < StandardError; end
9
+ class Template < StandardError; end
10
+ end
11
+ end
@@ -0,0 +1,108 @@
1
+ # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ =begin rdoc
5
+ Example:
6
+
7
+ require 'ramaze'
8
+ require 'ramaze/gestalt'
9
+
10
+ def random_color
11
+ r = lambda{|n| rand(n).to_s(16) }
12
+ '#' + [255, 255, 255].map{r[255] + r[255] + r[255]
13
+ end
14
+
15
+ puts Ramaze::Gestalt.build{
16
+ html do
17
+ head do
18
+ title{"Hello World"}
19
+ end
20
+ body do
21
+ h1{"Hello, World!"}
22
+ div(:style => 'width:100%') do
23
+ 10.times do
24
+ div(:style => "width:#{rand(100)}%;height:#{rand(100)}%;background:#{random_color}"){ '&nbsp;' }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ }
30
+ =end
31
+
32
+ module Ramaze
33
+
34
+ # Gestalt is the custom HTML/XML builder for Ramaze, based on a very simple
35
+ # DSL it will build your markup.
36
+
37
+ class Gestalt
38
+ attr_accessor :out
39
+
40
+ # The default way to start building your markup.
41
+ # Takes a block and returns the markup.
42
+ #
43
+ # Example:
44
+ # html =
45
+ # Gestalt.build do
46
+ # html do
47
+ # head do
48
+ # title "Hello, World!"
49
+ # end
50
+ # body do
51
+ # h1 "Hello, World!"
52
+ # end
53
+ # end
54
+ # end
55
+ #
56
+
57
+ def self.build &block
58
+ self.new(&block).to_s
59
+ end
60
+
61
+ # Gestalt.new is like ::build but will return itself.
62
+ # you can either access #out or .to_s it, which will
63
+ # return the actual markup.
64
+ #
65
+ # Useful for distributed building of one page.
66
+
67
+ def initialize &block
68
+ @out = ''
69
+ instance_eval(&block) if block_given?
70
+ end
71
+
72
+ # catching all the tags. passing it to _gestalt_build_tag
73
+
74
+ def method_missing meth, *args, &block
75
+ _gestalt_build_tag meth, *args, &block
76
+ end
77
+
78
+ # workaround for Kernel#p to make <p /> tags possible.
79
+
80
+ def p *args, &block
81
+ _gestalt_build_tag :p, *args, &block
82
+ end
83
+
84
+ # build a tag for `name`, using `args` and an optional block that
85
+ # will be yielded
86
+
87
+ def _gestalt_build_tag name, args = []
88
+ @out << "<#{name}"
89
+ if block_given?
90
+ @out << args.inject(''){ |s,v| s << %{ #{v[0]}="#{v[1]}"} }
91
+ @out << ">"
92
+ text = yield
93
+ @out << text if text != @out and text.respond_to?(:to_str)
94
+ @out << "</#{name}>"
95
+ else
96
+ @out << args.inject(''){ |s,v| s << %{ #{v[0]}="#{v[1]}"} }
97
+ @out << ' />'
98
+ end
99
+ end
100
+
101
+ # @out.to_s
102
+
103
+ def to_s
104
+ @out.to_s
105
+ end
106
+ alias to_str to_s
107
+ end
108
+ end
@@ -0,0 +1,120 @@
1
+ # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ require 'ostruct'
5
+ require 'set'
6
+
7
+ module Ramaze
8
+ class GlobalStruct < OpenStruct
9
+ # autoreload - Interval for autoreloading changed source in seconds
10
+ # adapter - Webserver-adapter ( :mongrel | :webrick )
11
+ # cache - Cache to use ( MemcachedCache | MemoryCache | YamlStoreCache )
12
+ # cache_actions - Finegrained caching based on actions (see CacheHelper)
13
+ # cache_all - Naive caching for all responses ( true | false )
14
+ # error_page - Show default errorpage with inspection and backtrace ( true | false )
15
+ # host - Host to respond to ( '0.0.0.0' )
16
+ # mapping - Route to controller map ( {} )
17
+ # port - First port of the port-range the adapters run on. ( 7000 )
18
+ # run_loose - Don't wait for the servers to finish, useful for testing ( true | false )
19
+ # tidy - Run all text/html responses through Tidy ( true | false )
20
+ # template_root - Default directory for your templates.
21
+ #
22
+ # inform_to - :stdout/'stdout'/$stderr (similar for stdout) or some path to a file
23
+ # inform_tags - a Set with any of [ :debug, :info, :error ]
24
+ # inform_backtrace_size - size of backtrace to be logged (and show on error-page).
25
+ # inform_timestamp - parameter for Time.strftime
26
+ # inform_prefix_info - prefix for all the Inform#info messages
27
+ # inform_prefix_debug - prefix for all the Inform#debug messages
28
+ # inform_prefix_error - prefix for all the Inform#error messages
29
+ #
30
+ # startup - List of methods and lambdas that are executed on startup
31
+ # ramaze_startup - Internal list of methods and lambdas that are executed on startup
32
+ #
33
+ # shutdown - List of methods and lambdas that are executed on startup
34
+ # ramaze_shutdown - Internal list of methods and lambdas that are executed on shutdown
35
+
36
+ DEFAULT = {
37
+ :autoreload => 5,
38
+ :adapter => :webrick,
39
+ :cache => MemoryCache,
40
+ :cache_actions => Hash.new{|h,k| h[k] = Set.new},
41
+ :cache_all => false,
42
+ :cookies => true,
43
+ :error_page => true,
44
+ :host => '0.0.0.0',
45
+ :mapping => {},
46
+ :port => 7000,
47
+ :run_loose => false,
48
+ :tidy => false,
49
+ :template_root => 'template',
50
+
51
+ :inform_to => $stdout,
52
+ :inform_tags => Set.new([:debug, :info, :error]),
53
+ :inform_backtrace_size => 10,
54
+ :inform_timestamp => "%Y-%m-%d %H:%M:%S",
55
+ :inform_prefix_info => 'INFO ',
56
+ :inform_prefix_debug => 'DEBUG',
57
+ :inform_prefix_error => 'ERROR',
58
+
59
+ :startup => [],
60
+ :ramaze_startup => [
61
+ :find_controllers, :setup_controllers, :init_autoreload, :init_adapter
62
+ ],
63
+
64
+ :shutdown => [],
65
+ :ramaze_shutdown => [
66
+ :kill_threads,
67
+ :close_inform,
68
+ lambda{ puts "Shutdown Ramaze (it's save to kill me now if i hang)" },
69
+ :exit
70
+ ],
71
+ }
72
+
73
+ # takes an hash of options and optionally an block that is evaled in this
74
+ # instance of GlobalStruct.
75
+
76
+ def setup hash = {}, &block
77
+ Global.instance_eval(&block) if block_given?
78
+ table.merge!( hash.keys_to_sym )
79
+ end
80
+
81
+ # just update the hash, not deleting values already set.
82
+ # again, takes a block, but your assignments may be
83
+ # overwritten if they existed before.
84
+
85
+ def update hash = {}, &block
86
+ old_table = table.dup
87
+ Global.instance_eval(&block) if block_given?
88
+ table.merge!( hash.keys_to_sym.merge( old_table ) )
89
+ end
90
+
91
+ # synonym to Global.key = value
92
+
93
+ def []=(key, value)
94
+ table[key.to_sym] = value
95
+ end
96
+
97
+ # synonym for Global.key
98
+
99
+ def [](key)
100
+ table[key.to_sym]
101
+ end
102
+
103
+ # get all the values for the given keys in the right order.
104
+
105
+ def values_at(*keys)
106
+ table.values_at(*keys.map(&:to_sym))
107
+ end
108
+
109
+ # iterate over the GlobalStruct, no guarantee on the order.
110
+
111
+ def each
112
+ table.each do |e|
113
+ yield(e)
114
+ end
115
+ end
116
+ end
117
+
118
+ Thread.current[:global] = GlobalStruct.new(GlobalStruct::DEFAULT)
119
+ Global = Thread.current[:global]
120
+ end
@@ -0,0 +1,32 @@
1
+ # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ require 'ramaze/trinity'
5
+
6
+ module Ramaze
7
+
8
+ # A module used by the Templates and the Controllers
9
+ # it provides both Ramaze::Trinity (request/response/session)
10
+ # and also a helper method, look below for more information about it
11
+
12
+ module Helper
13
+ include Trinity
14
+
15
+ private
16
+
17
+ # This loads the helper-files from /ramaze/helper/helpername.rb and
18
+ # includes it into Ramaze::Template (or wherever it is called)
19
+ #
20
+ # Usage:
21
+ # helper :redirect, :link
22
+
23
+ def helper *syms
24
+ syms.each do |sym|
25
+ mod_name = sym.to_s.capitalize + 'Helper'
26
+ require "ramaze/helper/#{sym}"
27
+ include ::Ramaze.const_get(mod_name)
28
+ extend ::Ramaze.const_get(mod_name)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,189 @@
1
+ # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ module Ramaze
5
+ # A helper that provides the means to wrap actions of the controller with
6
+ # other methods.
7
+ # For examples please look at the test/tc_aspect.rb
8
+ # this is not a default helper due to the possible performance-issues.
9
+ # However, it should be only an overhead of about 6-8 calls, so if you
10
+ # want this feature it shouldn't have too large impact ;)
11
+
12
+ module AspectHelper
13
+
14
+ # define the trait[:aspects] for the class that includes us
15
+ # also prepare hijacking of the :render method
16
+
17
+ def self.included(klass)
18
+ # if we haven't been included yet...
19
+ unless defined?(Traits[klass][:aspects]) and Traits[klass][:aspects]
20
+ Traits[klass] = {:aspects => {:pre => {}, :post => {}, :wrap => {}}}
21
+ unless defined?(klass.old_render)
22
+ klass.send(:alias_method, :old_render, :render)
23
+ klass.send(:alias_method, :render, :new_render)
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ # define pre-aspect which calls render(:your_pre_aspect)
31
+ # and appends it on your default action
32
+ # please note, that if you give can define
33
+ # pre :all, :all_, :except => [:action1, :action2]
34
+ # pre :all, :all_, :except => :action
35
+ # however, due to the nature of this helper, only action that have been
36
+ # defined so far are wrapped by the :all.
37
+ # methods that are in the :except (which is not mandatory) are ignored.
38
+ #
39
+ # the notion :all_ is a nice reminder that it is a pre-wrapper, you don't
40
+ # have to use the underscore, it's just my way to do it.
41
+ #
42
+ # Also, be careful, since :all will wrap other wraps that have been defined
43
+ # so far as well.
44
+ # Usually i don't think it's a good thing that order defines
45
+ # behaviour, but in this case it gives you quite powerful control
46
+ # over the whole process. Just watch out:
47
+ # With great power comes great responsibility
48
+ #
49
+ # Example:
50
+ # class FooController < Template::Ramaze
51
+ #
52
+ # def index
53
+ # 'foo'
54
+ # end
55
+ # pre :index, :_index
56
+ #
57
+ # def other
58
+ # 'foo'
59
+ # end
60
+ # pre :all, :all_, :except => :index
61
+ #
62
+ # def _index
63
+ # 'I will be put before your action'
64
+ # end
65
+ #
66
+ # def _all
67
+ # '<pre>'
68
+ # end
69
+ # end
70
+
71
+ def pre(*opts)
72
+ enwrap(:pre, *opts)
73
+ end
74
+ alias before pre
75
+
76
+ # define post-aspect which calls render(:your_post_aspect)
77
+ # and appends it on your default action
78
+ # please note, that if you give can define
79
+ # post :all, :all_, :except => [:action1, :action2]
80
+ # post :all, :all_, :except => :action
81
+ # however, due to the nature of this helper, only action that have been
82
+ # defined so far are wrapped by the :all.
83
+ # methods that are in the :except (which is not mandatory) are ignored.
84
+ #
85
+ # the notion :all_ is a nice reminder that it is a post-wrapper, you don't
86
+ # have to use the underscore, it's just my way to do it.
87
+ #
88
+ # Also, be careful, since :all will wrap other wraps that have been defined
89
+ # so far as well.
90
+ # Usually i don't think it's a good thing that order defines
91
+ # behaviour, but in this case it gives you quite powerful control
92
+ # over the whole process. Just watch out:
93
+ # With great power comes great responsibility
94
+ #
95
+ # Example:
96
+ # class FooController < Template::Ramaze
97
+ #
98
+ # def index
99
+ # 'foo'
100
+ # end
101
+ # post :index, :index_
102
+ #
103
+ # def other
104
+ # 'foo'
105
+ # end
106
+ # pre :all, :all_, :except => :index
107
+ #
108
+ # def index_
109
+ # 'I will be put after your action'
110
+ # end
111
+ #
112
+ # def all_
113
+ # '</pre>'
114
+ # end
115
+ # end
116
+
117
+ def post(*opts)
118
+ enwrap(:post, *opts)
119
+ end
120
+ alias after post
121
+
122
+ # a shortcut that combines pre and post
123
+ # same syntax as pre/post, just a linesaver
124
+
125
+ def wrap(*opts)
126
+ pre(*opts)
127
+ post(*opts)
128
+ end
129
+
130
+ # you shouldn't have to call this method directly
131
+ # however, if you really, really want to:
132
+ #
133
+ # enwrap(:post, :index, :my_post_method, :except => :bar
134
+
135
+ def enwrap(kind, key, meths, hash = {})
136
+ wrapping =
137
+ if key == :all
138
+ instance_methods(false).map{|im| im.to_sym}
139
+ else
140
+ if ([] + key rescue nil)
141
+ key.map{|k| k.to_sym}
142
+ else
143
+ [key.to_sym]
144
+ end
145
+ end
146
+
147
+ if hash[:except]
148
+ wrapping -= [hash[:except]].flatten.map{|m| m.to_sym}
149
+ end
150
+
151
+ wrapping.each do |meth|
152
+ ancestral_trait[:aspects][kind][meth] = meths
153
+ end
154
+ end
155
+
156
+ # find the post and pre actions for the current class
157
+
158
+ def resolve_aspect(action)
159
+ action = action.to_sym
160
+ aspects = ancestral_trait[:aspects]
161
+ {
162
+ :pre => aspects[:pre][action],
163
+ :post => aspects[:post][action]
164
+ }
165
+ end
166
+
167
+ # this will be exchanged for the :render method which is aliased
168
+ # to old_render
169
+ # it just searches for post and pre wrappers, calls them
170
+ # before/after your action and joins the results
171
+
172
+ def new_render(action, *params)
173
+ arity_for = lambda{|meth| method(meth).arity rescue -1 }
174
+ post, pre = resolve_aspect(action).values_at(:post, :pre)
175
+
176
+ if pre
177
+ arity = arity_for[pre].abs
178
+ pre_content = old_render(pre, *params[0,arity]) if pre
179
+ end
180
+
181
+ unless (pre_content.delete(:skip_next_aspects) rescue false)
182
+ content = old_render(action, *params)
183
+ post_content = old_render(post, *params) if post
184
+ end
185
+
186
+ [pre_content, content, post_content].join
187
+ end
188
+ end
189
+ end