contextr 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -18
- data/License.txt +20 -0
- data/Manifest.txt +15 -19
- data/README.txt +2 -49
- data/Rakefile +55 -88
- data/examples/general.rb +152 -0
- data/examples/ordering.rb +29 -0
- data/lib/contextr.rb +15 -15
- data/lib/contextr/class_methods.rb +90 -0
- data/lib/contextr/core_ext.rb +2 -0
- data/lib/contextr/core_ext/module.rb +18 -0
- data/lib/contextr/core_ext/object.rb +9 -0
- data/lib/contextr/event_machine.rb +71 -0
- data/lib/contextr/layer.rb +57 -381
- data/lib/contextr/modules/mutex_code.rb +22 -0
- data/lib/contextr/modules/unique_id.rb +13 -0
- data/lib/contextr/public_api.rb +58 -0
- data/lib/contextr/version.rb +2 -2
- data/lib/ext/active_support_subset.rb +85 -0
- data/spec/contextr_spec.rb +11 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +1 -1
- data/test/test_contextr.rb +11 -0
- data/website/index.html +23 -101
- data/website/index.txt +27 -95
- data/website/stylesheets/screen.css +9 -0
- data/website/template.rhtml +3 -8
- metadata +21 -26
- data/COPYING.txt +0 -340
- data/LICENSE.txt +0 -57
- data/examples/education.rb +0 -71
- data/examples/fibonacci.rb +0 -124
- data/examples/with_current_context.rb +0 -29
- data/lib/contextr/contextr.rb +0 -160
- data/lib/core_ext/class.rb +0 -29
- data/lib/core_ext/module.rb +0 -62
- data/lib/core_ext/proc.rb +0 -53
- data/lib/ext/method_nature.rb +0 -80
- data/rake/group_spec_task.rb +0 -7
- data/rake/specific_group_spec_task.rb +0 -7
- data/spec/contextr/contextr_api_spec.rb +0 -126
- data/spec/contextr/contextr_class_side_spec.rb +0 -77
- data/spec/contextr/contextr_functional_spec.rb +0 -293
- data/spec/core_ext/module_spec.rb +0 -101
- data/spec/core_ext/proc_spec.rb +0 -61
- data/tasks/annotations.rb +0 -107
- data/test/contextr/test_contextr.rb +0 -7
data/History.txt
CHANGED
@@ -1,19 +1,6 @@
|
|
1
|
-
|
1
|
+
== 0.1.0 2007-09-07
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
+++ 0.0.2 2007-05-08
|
9
|
-
|
10
|
-
+ 1 major change:
|
11
|
-
+ Changed the wrapper execution order to a hopefully more natural ordering
|
12
|
-
+ Added documentation
|
13
|
-
+ 1 minor change:
|
14
|
-
+ finished transition from unit tests to rspec based specification
|
15
|
-
|
16
|
-
+++ 0.0.1 2007-05-08
|
17
|
-
|
18
|
-
+ 1 major enhancement:
|
19
|
-
+ Initial release
|
3
|
+
* major changes
|
4
|
+
* reimplemented the whole stack
|
5
|
+
* changed the API significantly
|
6
|
+
* no backwards compatibility at all
|
data/License.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2007 FIXME full name
|
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/Manifest.txt
CHANGED
@@ -1,33 +1,29 @@
|
|
1
|
-
COPYING.txt
|
2
1
|
History.txt
|
3
|
-
|
2
|
+
License.txt
|
4
3
|
Manifest.txt
|
5
4
|
README.txt
|
6
5
|
Rakefile
|
7
|
-
examples/
|
8
|
-
examples/
|
9
|
-
examples/with_current_context.rb
|
6
|
+
examples/general.rb
|
7
|
+
examples/ordering.rb
|
10
8
|
lib/contextr.rb
|
11
|
-
lib/contextr/
|
9
|
+
lib/contextr/class_methods.rb
|
10
|
+
lib/contextr/core_ext.rb
|
11
|
+
lib/contextr/core_ext/module.rb
|
12
|
+
lib/contextr/core_ext/object.rb
|
13
|
+
lib/contextr/event_machine.rb
|
12
14
|
lib/contextr/layer.rb
|
15
|
+
lib/contextr/modules/mutex_code.rb
|
16
|
+
lib/contextr/modules/unique_id.rb
|
17
|
+
lib/contextr/public_api.rb
|
13
18
|
lib/contextr/version.rb
|
14
|
-
lib/
|
15
|
-
lib/core_ext/module.rb
|
16
|
-
lib/core_ext/proc.rb
|
19
|
+
lib/ext/active_support_subset.rb
|
17
20
|
lib/ext/dynamic.rb
|
18
|
-
lib/ext/method_nature.rb
|
19
|
-
rake/group_spec_task.rb
|
20
|
-
rake/specific_group_spec_task.rb
|
21
21
|
scripts/txt2html
|
22
22
|
setup.rb
|
23
|
-
spec/
|
24
|
-
spec/
|
25
|
-
spec/contextr/contextr_functional_spec.rb
|
26
|
-
spec/core_ext/module_spec.rb
|
27
|
-
spec/core_ext/proc_spec.rb
|
23
|
+
spec/contextr_spec.rb
|
24
|
+
spec/spec.opts
|
28
25
|
spec/spec_helper.rb
|
29
|
-
|
30
|
-
test/contextr/test_contextr.rb
|
26
|
+
test/test_contextr.rb
|
31
27
|
test/test_helper.rb
|
32
28
|
website/index.html
|
33
29
|
website/index.txt
|
data/README.txt
CHANGED
@@ -1,50 +1,3 @@
|
|
1
|
-
|
1
|
+
README for contextr
|
2
|
+
===================
|
2
3
|
|
3
|
-
A context-oriented programming library for Ruby.
|
4
|
-
|
5
|
-
Inspired by ContextL (Pascal Costanza) and ContextS (Robert Hirschfeld) with
|
6
|
-
thanks to Christian Neukirchen for giving the name and lots of ideas.
|
7
|
-
|
8
|
-
For more information see
|
9
|
-
- http://contextr.rubyforge.org/
|
10
|
-
- http://www.contextr.org/ or
|
11
|
-
- http://www.swa.hpi.uni-potsdam.de/cop/
|
12
|
-
|
13
|
-
This code is published under the same license as Ruby. See LICENSE.txt for more
|
14
|
-
information.
|
15
|
-
|
16
|
-
(c) 2007 - Gregor Schmidt - Berlin, Germany
|
17
|
-
|
18
|
-
= Usage
|
19
|
-
|
20
|
-
require 'rubygems'
|
21
|
-
require 'contextr'
|
22
|
-
|
23
|
-
class A
|
24
|
-
def a
|
25
|
-
puts "a"
|
26
|
-
end
|
27
|
-
|
28
|
-
layer :foo
|
29
|
-
|
30
|
-
foo.post :a do | n |
|
31
|
-
n.return_value += "_with_context"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
A.new.a # => "a"
|
36
|
-
|
37
|
-
ContextR::with_layers( :foo ) do
|
38
|
-
A.new.a # => "a_with_context"
|
39
|
-
end
|
40
|
-
|
41
|
-
= Starting Points
|
42
|
-
|
43
|
-
For a more detailed description
|
44
|
-
- visit the project homepage at RubyForge[http://contextr.rubyforge.org/]
|
45
|
-
- have a look at the +examples+ folder in the ContextR distribution
|
46
|
-
|
47
|
-
For detailed API descriptions have a look at the following classes and modules
|
48
|
-
- Class
|
49
|
-
- ContextR::LayerInClass
|
50
|
-
- ContextR::ClassMethods
|
data/Rakefile
CHANGED
@@ -8,19 +8,48 @@ require 'rake/rdoctask'
|
|
8
8
|
require 'rake/contrib/rubyforgepublisher'
|
9
9
|
require 'fileutils'
|
10
10
|
require 'hoe'
|
11
|
+
begin
|
12
|
+
require 'spec/rake/spectask'
|
13
|
+
rescue LoadError
|
14
|
+
puts 'To use rspec for testing you must install rspec gem:'
|
15
|
+
puts '$ sudo gem install rspec'
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
|
11
19
|
include FileUtils
|
12
20
|
require File.join(File.dirname(__FILE__), 'lib', 'contextr', 'version')
|
13
21
|
|
14
|
-
AUTHOR = '
|
22
|
+
AUTHOR = 'Gregor Schmidt' # can also be an array of Authors
|
15
23
|
EMAIL = "ruby@schmidtwisser.de"
|
16
24
|
DESCRIPTION = "The goal is to equip Ruby with an API to allow context-oriented programming."
|
17
25
|
GEM_NAME = 'contextr' # what ppl will type to install your gem
|
26
|
+
|
27
|
+
@config_file = "~/.rubyforge/user-config.yml"
|
28
|
+
@config = nil
|
29
|
+
def rubyforge_username
|
30
|
+
unless @config
|
31
|
+
begin
|
32
|
+
@config = YAML.load(File.read(File.expand_path(@config_file)))
|
33
|
+
rescue
|
34
|
+
puts <<-EOS
|
35
|
+
ERROR: No rubyforge config file found: #{@config_file}"
|
36
|
+
Run 'rubyforge setup' to prepare your env for access to Rubyforge
|
37
|
+
- See http://newgem.rubyforge.org/rubyforge.html for more details
|
38
|
+
EOS
|
39
|
+
exit
|
40
|
+
end
|
41
|
+
end
|
42
|
+
@rubyforge_username ||= @config["username"]
|
43
|
+
end
|
44
|
+
|
18
45
|
RUBYFORGE_PROJECT = 'contextr' # The unix name for your project
|
19
46
|
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
20
47
|
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
21
48
|
|
22
49
|
NAME = "contextr"
|
23
|
-
REV =
|
50
|
+
REV = nil
|
51
|
+
# UNCOMMENT IF REQUIRED:
|
52
|
+
# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
|
24
53
|
VERS = ContextR::VERSION::STRING + (REV ? ".#{REV}" : "")
|
25
54
|
CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
|
26
55
|
RDOC_OPTS = ['--quiet', '--title', 'contextr documentation',
|
@@ -45,7 +74,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
45
74
|
p.url = HOMEPATH
|
46
75
|
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
47
76
|
p.test_globs = ["test/**/test_*.rb"]
|
48
|
-
p.clean_globs
|
77
|
+
p.clean_globs |= CLEAN #An array of file patterns to delete on clean.
|
49
78
|
|
50
79
|
# == Optional
|
51
80
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
@@ -53,6 +82,9 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
53
82
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
54
83
|
end
|
55
84
|
|
85
|
+
CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\n\n")
|
86
|
+
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
87
|
+
hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
|
56
88
|
|
57
89
|
desc 'Generate website files'
|
58
90
|
task :website_generate do
|
@@ -63,19 +95,26 @@ end
|
|
63
95
|
|
64
96
|
desc 'Upload website files to rubyforge'
|
65
97
|
task :website_upload do
|
66
|
-
|
67
|
-
|
68
|
-
remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/"
|
69
|
-
# remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
98
|
+
host = "#{rubyforge_username}@rubyforge.org"
|
99
|
+
remote_dir = "/var/www/gforge-projects/#{PATH}/"
|
70
100
|
local_dir = 'website'
|
71
|
-
sh %{rsync -
|
101
|
+
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
72
102
|
end
|
73
103
|
|
74
104
|
desc 'Generate and upload website files'
|
75
|
-
task :website => [:website_generate, :website_upload]
|
105
|
+
task :website => [:website_generate, :website_upload, :publish_docs]
|
76
106
|
|
77
107
|
desc 'Release the website and new gem version'
|
78
|
-
task :deploy => [:check_version, :website, :release]
|
108
|
+
task :deploy => [:check_version, :website, :release] do
|
109
|
+
puts "Remember to create SVN tag:"
|
110
|
+
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
111
|
+
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
112
|
+
puts "Suggested comment:"
|
113
|
+
puts "Tagging release #{CHANGES}"
|
114
|
+
end
|
115
|
+
|
116
|
+
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
117
|
+
task :local_deploy => [:website_generate, :install_gem]
|
79
118
|
|
80
119
|
task :check_version do
|
81
120
|
unless ENV['VERSION']
|
@@ -88,83 +127,11 @@ task :check_version do
|
|
88
127
|
end
|
89
128
|
end
|
90
129
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
# remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/api"
|
96
|
-
# local_dir = 'doc'
|
97
|
-
# sh %{rsync -av --delete-excluded --exclude=".*/" #{local_dir}/ #{host}:#{remote_dir}}
|
98
|
-
#end
|
99
|
-
|
100
|
-
# Most of this code was taken from the Rubinius Rakefile.
|
101
|
-
# Thanks for the help.
|
102
|
-
|
103
|
-
ROOT = File.expand_path(File.dirname(__FILE__))
|
104
|
-
|
105
|
-
def load_files(files)
|
106
|
-
files.each do |path|
|
107
|
-
begin
|
108
|
-
require(path)
|
109
|
-
rescue Object => e
|
110
|
-
STDERR.puts "Unable to load #{path}. #{e.message} (#{e.class})"
|
111
|
-
end
|
112
|
-
end
|
130
|
+
desc "Run the specs under spec/models"
|
131
|
+
Spec::Rake::SpecTask.new do |t|
|
132
|
+
t.spec_opts = ['--options', "spec/spec.opts"]
|
133
|
+
t.spec_files = FileList['spec/*_spec.rb']
|
113
134
|
end
|
114
|
-
def require_files(files)
|
115
|
-
files.each do |path|
|
116
|
-
begin
|
117
|
-
require(path)
|
118
|
-
rescue Object => e
|
119
|
-
STDERR.puts "Unable to load #{path}. #{e.message} (#{e.class})"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
begin
|
125
|
-
require 'spec/rake/spectask'
|
126
|
-
rescue LoadError
|
127
|
-
raise <<-EOM
|
128
|
-
Unable to load spec/rake/spectask. RSpec is a requirement to build Rubinius.
|
129
|
-
Please install RSpec before building (http://rspec.rubyforge.org).
|
130
|
-
EOM
|
131
|
-
end
|
132
|
-
|
133
|
-
# Task class extensions
|
134
|
-
paths = Dir[ File.join(File.dirname(__FILE__), 'rake/*') ]
|
135
|
-
require_files(paths)
|
136
|
-
#
|
137
|
-
# Other tasks
|
138
|
-
paths = Dir[ File.join(File.dirname(__FILE__), 'tasks/*') ]
|
139
|
-
load_files(paths)
|
140
|
-
|
141
|
-
desc "Run all specs and tests"
|
142
|
-
task :default => [ :spec, :test ]
|
143
|
-
|
144
|
-
task :spec => 'spec:all'
|
145
|
-
|
146
|
-
# Generate all the spec tasks
|
147
|
-
namespace :spec do
|
148
|
-
|
149
|
-
spec_targets = %w(contextr core_ext)
|
150
|
-
|
151
|
-
spec_targets.each do | group |
|
152
|
-
spec_files = Dir[ File.join( File.dirname(__FILE__),
|
153
|
-
"spec/#{group}/*_spec.rb") ]
|
154
|
-
|
155
|
-
GroupSpecTask.new( group )
|
156
|
-
|
157
|
-
namespace group do
|
158
|
-
spec_files.each do | file |
|
159
|
-
SpecificGroupSpecTask.new( File.basename( file, '_spec.rb'), group )
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
desc "Run all specs."
|
165
|
-
task :all => spec_targets.collect! { | group | 'spec:' << group }
|
166
|
-
end
|
167
|
-
|
168
|
-
desc "Run all benchmarks - currently none"
|
169
|
-
task :benchmark
|
170
135
|
|
136
|
+
desc "Run specs and tests by default"
|
137
|
+
task :default => [:spec, :test]
|
data/examples/general.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../lib/contextr.rb"
|
2
|
+
|
3
|
+
module Common
|
4
|
+
module AddressMethods
|
5
|
+
def to_s
|
6
|
+
[yield(:next), yield(:receiver).address].join("; ")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Student < Struct.new(:first_name, :last_name, :address, :university)
|
12
|
+
def to_s
|
13
|
+
[first_name, last_name].join(" ")
|
14
|
+
end
|
15
|
+
|
16
|
+
module EducationMethods
|
17
|
+
def to_s
|
18
|
+
[yield(:next), yield(:receiver).university].join("; ")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
include Common
|
23
|
+
include EducationMethods => :education
|
24
|
+
include AddressMethods => :address
|
25
|
+
end
|
26
|
+
|
27
|
+
class University < Struct.new(:name, :address)
|
28
|
+
def to_s
|
29
|
+
name
|
30
|
+
end
|
31
|
+
|
32
|
+
include Common
|
33
|
+
include AddressMethods => :address
|
34
|
+
end
|
35
|
+
|
36
|
+
module Fibonacci
|
37
|
+
module ClassMethods
|
38
|
+
def compute(fixnum)
|
39
|
+
if fixnum == 1 or fixnum == 0
|
40
|
+
fixnum
|
41
|
+
elsif fixnum < 0
|
42
|
+
raise ArgumentError, "Fibonacci not defined for negative numbers"
|
43
|
+
else
|
44
|
+
compute(fixnum - 1) + compute(fixnum - 2)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module LoggingMethods
|
49
|
+
def compute(fixnum)
|
50
|
+
print "."
|
51
|
+
yield(:next, fixnum)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
module CacheMethods
|
56
|
+
def cache
|
57
|
+
@cache ||={}
|
58
|
+
end
|
59
|
+
|
60
|
+
def compute(fixnum)
|
61
|
+
cache[fixnum] ||= yield(:next, fixnum)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
self.extend(ClassMethods)
|
67
|
+
include :class_side => true,
|
68
|
+
ClassMethods::CacheMethods => :cache,
|
69
|
+
ClassMethods::LoggingMethods => :logging
|
70
|
+
end
|
71
|
+
|
72
|
+
puts
|
73
|
+
puts "Example on Instance Side"
|
74
|
+
module Example
|
75
|
+
module ClassMethods
|
76
|
+
def show
|
77
|
+
me = Student.new("Gregor", "Schmidt", "Berlin")
|
78
|
+
hpi = University.new("HPI", "Potsdam")
|
79
|
+
me.university = hpi
|
80
|
+
print(me)
|
81
|
+
end
|
82
|
+
|
83
|
+
def print(me)
|
84
|
+
puts me
|
85
|
+
with_addresses do
|
86
|
+
puts me
|
87
|
+
end
|
88
|
+
with_education do
|
89
|
+
puts me
|
90
|
+
end
|
91
|
+
with_education do
|
92
|
+
with_addresses do
|
93
|
+
puts me
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def with_addresses
|
99
|
+
ContextR::with_layers :address do
|
100
|
+
yield
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def with_education
|
105
|
+
ContextR::with_layers :education do
|
106
|
+
yield
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
self.extend(ClassMethods)
|
111
|
+
end
|
112
|
+
Example.show
|
113
|
+
|
114
|
+
puts
|
115
|
+
puts "Example with changed instance methods after behaviour registration"
|
116
|
+
class Student
|
117
|
+
def to_s
|
118
|
+
[first_name, last_name].reverse.join(", ")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
Example.show
|
122
|
+
|
123
|
+
puts
|
124
|
+
puts "Example with changed behaviour methods after their registration"
|
125
|
+
module Student::EducationMethods
|
126
|
+
def to_s
|
127
|
+
[yield(:next), yield(:receiver).university].join("\n - ")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
Example.show
|
131
|
+
|
132
|
+
puts
|
133
|
+
puts "Example on Class Side"
|
134
|
+
class ExampleClassSide
|
135
|
+
module ClassMethods
|
136
|
+
def show(int = 3)
|
137
|
+
puts Fibonacci.compute(int)
|
138
|
+
ContextR::with_layers :cache do
|
139
|
+
puts Fibonacci.compute(int)
|
140
|
+
end
|
141
|
+
ContextR::with_layers :logging do
|
142
|
+
puts Fibonacci.compute(2 * int)
|
143
|
+
|
144
|
+
ContextR::with_layers :cache do
|
145
|
+
puts Fibonacci.compute(2 * int)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
self.extend(ClassMethods)
|
151
|
+
end
|
152
|
+
ExampleClassSide.show
|