shared 1.0.0 → 1.1.0
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.
- data/README +25 -184
- data/Rakefile +228 -0
- data/lib/shared.rb +81 -27
- data/readme.erb +37 -0
- data/shared.gemspec +26 -0
- metadata +9 -26
- data/a.rb +0 -12
- data/ann-shared-0.4.2.txt +0 -183
- data/gemspec.rb +0 -38
- data/gen_readme.rb +0 -35
- data/install.rb +0 -214
- data/samples/a.rb +0 -20
- data/samples/b.rb +0 -18
- data/samples/c.rb +0 -25
- data/samples/d.rb +0 -21
- data/samples/e.rb +0 -30
data/README
CHANGED
@@ -2,195 +2,36 @@ NAME
|
|
2
2
|
shared.rb
|
3
3
|
|
4
4
|
DESCRIPTION
|
5
|
-
|
5
|
+
shared.rb provides a super easy way to share code between classes or modules
|
6
|
+
in a simple way. shared code can be at the class and/or instance level and
|
7
|
+
users deferred evaluation so this is more powerful that the normal ruby
|
8
|
+
module inclusion facilities on which it is based.
|
6
9
|
|
7
|
-
|
8
|
-
|
10
|
+
SYNOPSIS
|
11
|
+
require 'shared'
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
Shared 'methods' do
|
14
|
+
class << self
|
15
|
+
attr :classname
|
16
|
+
end
|
13
17
|
|
14
|
-
|
15
|
-
1.0.0
|
16
|
-
- add Share/Shared methods
|
17
|
-
- move from @@vars to closure based impl
|
18
|
+
@classname = name.downcase
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
0.4.3
|
24
|
-
- added version info
|
25
|
-
- move methods from Object to Kernel and made them private (thx Stefan
|
26
|
-
Rusterholz)
|
20
|
+
def objectname
|
21
|
+
self.class.classname + "(#{ object_id })"
|
22
|
+
end
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
25
|
+
class C
|
26
|
+
include Shared('methods')
|
27
|
+
end
|
30
28
|
|
31
|
-
|
29
|
+
class B
|
30
|
+
include Shared('methods')
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
~ > cat samples/a.rb
|
36
|
-
|
37
|
-
# shared.rb is a very simple and very powerful method of sharing code between
|
38
|
-
# classes.
|
39
|
-
#
|
40
|
-
require 'shared'
|
41
|
-
|
42
|
-
shared(:code) do
|
43
|
-
def classname() self.class.name end
|
44
|
-
end
|
45
|
-
|
46
|
-
class Foo
|
47
|
-
include shared(:code)
|
48
|
-
end
|
49
|
-
|
50
|
-
class Bar
|
51
|
-
include shared(:code)
|
52
|
-
end
|
53
|
-
|
54
|
-
p Foo.new.classname #=> "Foo"
|
55
|
-
|
56
|
-
p Bar.new.classname #=> "Bar"
|
57
|
-
|
58
|
-
~ > ruby samples/a.rb
|
59
|
-
|
60
|
-
"Foo"
|
61
|
-
"Bar"
|
62
|
-
|
63
|
-
|
64
|
-
<========< samples/b.rb >========>
|
65
|
-
|
66
|
-
~ > cat samples/b.rb
|
67
|
-
|
68
|
-
# shared.rb allows natural declaration of both instance and class-level
|
69
|
-
# methods - it's more than simple module inclusion
|
70
|
-
#
|
71
|
-
|
72
|
-
require 'shared'
|
73
|
-
|
74
|
-
shared('methods') do
|
75
|
-
def self.class_method() 40 end
|
76
|
-
|
77
|
-
def instance_method() 2 end
|
78
|
-
end
|
79
|
-
|
80
|
-
class C
|
81
|
-
include shared('methods')
|
82
|
-
end
|
83
|
-
|
84
|
-
p(C.class_method + C.new.instance_method) #=> 42
|
85
|
-
|
86
|
-
|
87
|
-
~ > ruby samples/b.rb
|
88
|
-
|
89
|
-
42
|
90
|
-
|
91
|
-
|
92
|
-
<========< samples/c.rb >========>
|
93
|
-
|
94
|
-
~ > cat samples/c.rb
|
95
|
-
|
96
|
-
# shared.rb works equally well with individual objects in addition to the
|
97
|
-
# normal class level usage
|
98
|
-
#
|
99
|
-
|
100
|
-
require 'shared'
|
101
|
-
|
102
|
-
shared(:meta_tools) do
|
103
|
-
def singleton_class &block
|
104
|
-
singleton_class =
|
105
|
-
class << self
|
106
|
-
self
|
107
|
-
end
|
108
|
-
block ? singleton_class.module_eval(&block) : singleton_class
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
a = %w( a b c )
|
113
|
-
|
114
|
-
a.extend shared(:meta_tools)
|
115
|
-
|
116
|
-
a.singleton_class do
|
117
|
-
def to_range() first .. last end
|
118
|
-
end
|
119
|
-
|
120
|
-
p a.to_range #=> "a".."c"
|
121
|
-
|
122
|
-
~ > ruby samples/c.rb
|
123
|
-
|
124
|
-
"a".."c"
|
125
|
-
|
126
|
-
|
127
|
-
<========< samples/d.rb >========>
|
128
|
-
|
129
|
-
~ > cat samples/d.rb
|
130
|
-
|
131
|
-
# an example use-case for shared.rb is sharing code bewteen classes that
|
132
|
-
# require both class level and instance level behaviour to be shared
|
133
|
-
#
|
134
|
-
|
135
|
-
require 'shared'
|
136
|
-
|
137
|
-
shared(:acts_as_named) do
|
138
|
-
validates_precence_of :name
|
139
|
-
|
140
|
-
def to_html() "<blink> #{ name } </blink>" end
|
141
|
-
end
|
142
|
-
|
143
|
-
class Model
|
144
|
-
def Model.validates_precence_of(*a) end
|
145
|
-
|
146
|
-
def name() 'zaphod' end
|
147
|
-
|
148
|
-
include shared(:acts_as_named)
|
149
|
-
end
|
150
|
-
|
151
|
-
p Model.new.to_html #=> "<blink> zaphod </blink>"
|
152
|
-
|
153
|
-
~ > ruby samples/d.rb
|
154
|
-
|
155
|
-
"<blink> zaphod </blink>"
|
156
|
-
|
157
|
-
|
158
|
-
<========< samples/e.rb >========>
|
159
|
-
|
160
|
-
~ > cat samples/e.rb
|
161
|
-
|
162
|
-
# it's important to note that the shared code is injected into the reciever
|
163
|
-
# fresh on each call and, in that way, the effect is rather macro like
|
164
|
-
#
|
165
|
-
|
166
|
-
require 'shared'
|
167
|
-
|
168
|
-
share(:instance_tracker) do
|
169
|
-
const_set :Instances, []
|
170
|
-
|
171
|
-
def self.instances() const_get :Instances end
|
172
|
-
|
173
|
-
def self.new *a, &b
|
174
|
-
obj = super
|
175
|
-
ensure
|
176
|
-
instances << obj
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
class Foo
|
181
|
-
include shared(:instance_tracker)
|
182
|
-
end
|
183
|
-
|
184
|
-
class Bar
|
185
|
-
include shared(:instance_tracker)
|
186
|
-
end
|
187
|
-
|
188
|
-
2.times{ Foo.new }
|
189
|
-
40.times{ Bar.new }
|
190
|
-
|
191
|
-
p(Foo.instances.size + Bar.instances.size)
|
192
|
-
|
193
|
-
~ > ruby samples/e.rb
|
194
|
-
|
195
|
-
42
|
33
|
+
p C.classname #=> 'c'
|
34
|
+
p C.new.objectname #=> 'c(1234)'
|
196
35
|
|
36
|
+
p B.classname #=> 'b'
|
37
|
+
p B.new.objectname #=> 'b(4567)'
|
data/Rakefile
ADDED
@@ -0,0 +1,228 @@
|
|
1
|
+
|
2
|
+
This.rubyforge_project = 'codeforpeople'
|
3
|
+
This.author = "Ara T. Howard"
|
4
|
+
This.email = "ara.t.howard@gmail.com"
|
5
|
+
This.homepage = "http://github.com/ahoward/#{ This.lib }/tree/master"
|
6
|
+
|
7
|
+
|
8
|
+
task :default do
|
9
|
+
puts(Rake::Task.tasks.map{|task| task.name} - ['default'])
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
task :gemspec do
|
14
|
+
ignore_extensions = 'git', 'svn', 'tmp', /sw./, 'bak', 'gem'
|
15
|
+
ignore_directories = 'pkg'
|
16
|
+
ignore_files = 'test/log'
|
17
|
+
|
18
|
+
shiteless =
|
19
|
+
lambda do |list|
|
20
|
+
list.delete_if do |entry|
|
21
|
+
next unless test(?e, entry)
|
22
|
+
extension = File.basename(entry).split(%r/[.]/).last
|
23
|
+
ignore_extensions.any?{|ext| ext === extension}
|
24
|
+
end
|
25
|
+
list.delete_if do |entry|
|
26
|
+
next unless test(?d, entry)
|
27
|
+
dirname = File.expand_path(entry)
|
28
|
+
ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
|
29
|
+
end
|
30
|
+
list.delete_if do |entry|
|
31
|
+
next unless test(?f, entry)
|
32
|
+
filename = File.expand_path(entry)
|
33
|
+
ignore_files.any?{|file| File.expand_path(file) == filename}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
lib = This.lib
|
38
|
+
version = This.version
|
39
|
+
files = shiteless[Dir::glob("**/**")]
|
40
|
+
executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
|
41
|
+
has_rdoc = true #File.exist?('doc')
|
42
|
+
test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
|
43
|
+
|
44
|
+
extensions = This.extensions
|
45
|
+
if extensions.nil?
|
46
|
+
%w( Makefile configure extconf.rb ).each do |ext|
|
47
|
+
extensions << ext if File.exists?(ext)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
extensions = [extensions].flatten.compact
|
51
|
+
|
52
|
+
template =
|
53
|
+
if test(?e, 'gemspec.erb')
|
54
|
+
Template{ IO.read('gemspec.erb') }
|
55
|
+
else
|
56
|
+
Template {
|
57
|
+
<<-__
|
58
|
+
## #{ lib }.gemspec
|
59
|
+
#
|
60
|
+
|
61
|
+
Gem::Specification::new do |spec|
|
62
|
+
spec.name = #{ lib.inspect }
|
63
|
+
spec.version = #{ version.inspect }
|
64
|
+
spec.platform = Gem::Platform::RUBY
|
65
|
+
spec.summary = #{ lib.inspect }
|
66
|
+
|
67
|
+
spec.files = #{ files.inspect }
|
68
|
+
spec.executables = #{ executables.inspect }
|
69
|
+
|
70
|
+
spec.require_path = "lib"
|
71
|
+
|
72
|
+
spec.has_rdoc = #{ has_rdoc.inspect }
|
73
|
+
spec.test_files = #{ test_files.inspect }
|
74
|
+
#spec.add_dependency 'lib', '>= version'
|
75
|
+
#spec.add_dependency 'fattr'
|
76
|
+
|
77
|
+
spec.extensions.push(*#{ extensions.inspect })
|
78
|
+
|
79
|
+
spec.rubyforge_project = #{ This.rubyforge_project.inspect }
|
80
|
+
spec.author = #{ This.author.inspect }
|
81
|
+
spec.email = #{ This.email.inspect }
|
82
|
+
spec.homepage = #{ This.homepage.inspect }
|
83
|
+
end
|
84
|
+
__
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
open("#{ lib }.gemspec", "w"){|fd| fd.puts template}
|
89
|
+
This.gemspec = "#{ lib }.gemspec"
|
90
|
+
end
|
91
|
+
|
92
|
+
task :gem => [:clean, :gemspec] do
|
93
|
+
Fu.mkdir_p This.pkgdir
|
94
|
+
before = Dir['*.gem']
|
95
|
+
cmd = "gem build #{ This.gemspec }"
|
96
|
+
`#{ cmd }`
|
97
|
+
after = Dir['*.gem']
|
98
|
+
gem = ((after - before).first || after.first) or abort('no gem!')
|
99
|
+
Fu.mv gem, This.pkgdir
|
100
|
+
This.gem = File.basename(gem)
|
101
|
+
end
|
102
|
+
|
103
|
+
task :readme do
|
104
|
+
samples = ''
|
105
|
+
prompt = '~ > '
|
106
|
+
lib = This.lib
|
107
|
+
version = This.version
|
108
|
+
|
109
|
+
Dir['sample*/*'].sort.each do |sample|
|
110
|
+
samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
|
111
|
+
|
112
|
+
cmd = "cat #{ sample }"
|
113
|
+
samples << Util.indent(prompt + cmd, 2) << "\n\n"
|
114
|
+
samples << Util.indent(`#{ cmd }`, 4) << "\n"
|
115
|
+
|
116
|
+
cmd = "ruby #{ sample }"
|
117
|
+
samples << Util.indent(prompt + cmd, 2) << "\n\n"
|
118
|
+
|
119
|
+
cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib #{ sample })'"
|
120
|
+
samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
template =
|
124
|
+
if test(?e, 'readme.erb')
|
125
|
+
Template{ IO.read('readme.erb') }
|
126
|
+
else
|
127
|
+
Template {
|
128
|
+
<<-__
|
129
|
+
NAME
|
130
|
+
#{ lib }
|
131
|
+
|
132
|
+
DESCRIPTION
|
133
|
+
|
134
|
+
INSTALL
|
135
|
+
gem install #{ lib }
|
136
|
+
|
137
|
+
SAMPLES
|
138
|
+
#{ samples }
|
139
|
+
__
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
open("README", "w"){|fd| fd.puts template}
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
task :clean do
|
148
|
+
Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
task :release => [:clean, :gemspec, :gem] do
|
153
|
+
gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
|
154
|
+
raise "which one? : #{ gems.inspect }" if gems.size > 1
|
155
|
+
raise "no gems?" if gems.size < 1
|
156
|
+
cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.pkgdir }/#{ This.gem }"
|
157
|
+
puts cmd
|
158
|
+
system cmd
|
159
|
+
end
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
BEGIN {
|
166
|
+
$VERBOSE = nil
|
167
|
+
|
168
|
+
require 'ostruct'
|
169
|
+
require 'erb'
|
170
|
+
require 'fileutils'
|
171
|
+
|
172
|
+
Fu = FileUtils
|
173
|
+
|
174
|
+
This = OpenStruct.new
|
175
|
+
|
176
|
+
This.file = File.expand_path(__FILE__)
|
177
|
+
This.dir = File.dirname(This.file)
|
178
|
+
This.pkgdir = File.join(This.dir, 'pkg')
|
179
|
+
|
180
|
+
lib = ENV['LIB']
|
181
|
+
unless lib
|
182
|
+
lib = File.basename(Dir.pwd)
|
183
|
+
end
|
184
|
+
This.lib = lib
|
185
|
+
|
186
|
+
version = ENV['VERSION']
|
187
|
+
unless version
|
188
|
+
name = lib.capitalize
|
189
|
+
require "./lib/#{ lib }"
|
190
|
+
version = eval(name).send(:version)
|
191
|
+
end
|
192
|
+
This.version = version
|
193
|
+
|
194
|
+
abort('no lib') unless This.lib
|
195
|
+
abort('no version') unless This.version
|
196
|
+
|
197
|
+
module Util
|
198
|
+
def indent(s, n = 2)
|
199
|
+
s = unindent(s)
|
200
|
+
ws = ' ' * n
|
201
|
+
s.gsub(%r/^/, ws)
|
202
|
+
end
|
203
|
+
|
204
|
+
def unindent(s)
|
205
|
+
indent = nil
|
206
|
+
s.each do |line|
|
207
|
+
next if line =~ %r/^\s*$/
|
208
|
+
indent = line[%r/^\s*/] and break
|
209
|
+
end
|
210
|
+
indent ? s.gsub(%r/^#{ indent }/, "") : s
|
211
|
+
end
|
212
|
+
extend self
|
213
|
+
end
|
214
|
+
|
215
|
+
class Template
|
216
|
+
def initialize(&block)
|
217
|
+
@block = block
|
218
|
+
@template = block.call.to_s
|
219
|
+
end
|
220
|
+
def expand(b=nil)
|
221
|
+
ERB.new(Util.unindent(@template)).result(b||@block)
|
222
|
+
end
|
223
|
+
alias_method 'to_s', 'expand'
|
224
|
+
end
|
225
|
+
def Template(*args, &block) Template.new(*args, &block) end
|
226
|
+
|
227
|
+
Dir.chdir(This.dir)
|
228
|
+
}
|
data/lib/shared.rb
CHANGED
@@ -1,42 +1,96 @@
|
|
1
|
+
# shared.rb provides a super easy way to share code between classes or modules
|
2
|
+
# in a simple way. shared code can be at the class and/or instance level and
|
3
|
+
# users deferred evaluation so this is more powerful that the normal ruby
|
4
|
+
# module inclusion facilities on which it is based.
|
5
|
+
#
|
6
|
+
# basic usage:
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# require 'shared'
|
10
|
+
#
|
11
|
+
# Shared 'methods' do
|
12
|
+
# class << self
|
13
|
+
# attr :classname
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# @classname = name.downcase
|
17
|
+
#
|
18
|
+
# def objectname
|
19
|
+
# self.class.classname + "(#{ object_id })"
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# class C
|
24
|
+
# include Shared('methods')
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# class B
|
28
|
+
# include Shared('methods')
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# p C.classname #=> 'c'
|
32
|
+
# p C.new.objectname #=> 'c(1234)'
|
33
|
+
#
|
34
|
+
# p B.classname #=> 'b'
|
35
|
+
# p B.new.objectname #=> 'b(4567)'
|
36
|
+
#
|
37
|
+
|
38
|
+
|
1
39
|
unless defined?(Shared)
|
2
40
|
module Shared
|
3
|
-
Shared::VERSION = '1.
|
41
|
+
Shared::VERSION = '1.1.0' unless defined?(Shared::VERSION)
|
4
42
|
def version() Shared::VERSION end
|
5
43
|
|
6
44
|
Code = {}
|
7
45
|
|
8
|
-
def
|
46
|
+
def load key
|
47
|
+
key = key_for(key)
|
48
|
+
unless Code.has_key?(key)
|
49
|
+
::Kernel.load("shared/#{ key }.rb")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def shared name, options = {}, &block
|
9
54
|
key = key_for name
|
55
|
+
via = (options[:via]||options['via']||:eval).to_s.to_sym
|
10
56
|
|
11
|
-
|
57
|
+
if block.nil?
|
58
|
+
Shared.load(key)
|
59
|
+
return Code[key]
|
60
|
+
end
|
12
61
|
|
13
62
|
m = (Code[key] || Module.new)
|
14
63
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
64
|
+
case via
|
65
|
+
when :eval
|
66
|
+
singleton_class(m) do
|
67
|
+
unless m.respond_to?(:blocks)
|
68
|
+
blocks = []
|
19
69
|
|
20
|
-
|
21
|
-
blocks.each{|b| other.send(:module_eval, &b)}
|
22
|
-
end
|
70
|
+
define_method(:blocks){ blocks }
|
23
71
|
|
24
|
-
|
25
|
-
|
26
|
-
|
72
|
+
define_method(:included) do |other|
|
73
|
+
blocks.each{|b| other.send(:module_eval, &b)}
|
74
|
+
end
|
75
|
+
|
76
|
+
define_method(:extend_object) do |other|
|
77
|
+
Shared.singleton_class(other) do
|
78
|
+
m.blocks.each{|b| module_eval &b}
|
79
|
+
end
|
80
|
+
end
|
27
81
|
end
|
28
82
|
end
|
29
|
-
|
30
|
-
end
|
83
|
+
m.blocks << block
|
31
84
|
|
32
|
-
|
85
|
+
when :module
|
86
|
+
m.send(:module_eval, &block)
|
87
|
+
end
|
33
88
|
|
34
89
|
Code[key] ||= m
|
35
90
|
end
|
36
91
|
|
37
92
|
alias_method 'share', 'shared'
|
38
93
|
alias_method 'for', 'shared'
|
39
|
-
alias_method '[]', 'shared'
|
40
94
|
|
41
95
|
def key_for name
|
42
96
|
name.to_s.strip.downcase
|
@@ -55,20 +109,20 @@ unless defined?(Shared)
|
|
55
109
|
|
56
110
|
module Kernel
|
57
111
|
private
|
58
|
-
def share(*a, &b)
|
59
|
-
Shared.share(*a, &b)
|
60
|
-
end
|
61
|
-
|
62
112
|
def Share(*a, &b)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
113
|
+
if a.empty? and b.nil?
|
114
|
+
::Shared
|
115
|
+
else
|
116
|
+
Shared.share(*a, &b)
|
117
|
+
end
|
68
118
|
end
|
69
119
|
|
70
120
|
def Shared(*a, &b)
|
71
|
-
|
121
|
+
if a.empty? and b.nil?
|
122
|
+
::Shared
|
123
|
+
else
|
124
|
+
Shared.shared(*a, &b)
|
125
|
+
end
|
72
126
|
end
|
73
127
|
end
|
74
128
|
end
|
data/readme.erb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
NAME
|
2
|
+
shared.rb
|
3
|
+
|
4
|
+
DESCRIPTION
|
5
|
+
shared.rb provides a super easy way to share code between classes or modules
|
6
|
+
in a simple way. shared code can be at the class and/or instance level and
|
7
|
+
users deferred evaluation so this is more powerful that the normal ruby
|
8
|
+
module inclusion facilities on which it is based.
|
9
|
+
|
10
|
+
SYNOPSIS
|
11
|
+
require 'shared'
|
12
|
+
|
13
|
+
Shared 'methods' do
|
14
|
+
class << self
|
15
|
+
attr :classname
|
16
|
+
end
|
17
|
+
|
18
|
+
@classname = name.downcase
|
19
|
+
|
20
|
+
def objectname
|
21
|
+
self.class.classname + "(#{ object_id })"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class C
|
26
|
+
include Shared('methods')
|
27
|
+
end
|
28
|
+
|
29
|
+
class B
|
30
|
+
include Shared('methods')
|
31
|
+
end
|
32
|
+
|
33
|
+
p C.classname #=> 'c'
|
34
|
+
p C.new.objectname #=> 'c(1234)'
|
35
|
+
|
36
|
+
p B.classname #=> 'b'
|
37
|
+
p B.new.objectname #=> 'b(4567)'
|
data/shared.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
## shared.gemspec
|
2
|
+
#
|
3
|
+
|
4
|
+
Gem::Specification::new do |spec|
|
5
|
+
spec.name = "shared"
|
6
|
+
spec.version = "1.1.0"
|
7
|
+
spec.platform = Gem::Platform::RUBY
|
8
|
+
spec.summary = "shared"
|
9
|
+
|
10
|
+
spec.files = ["lib", "lib/shared.rb", "Rakefile", "README", "readme.erb", "shared.gemspec"]
|
11
|
+
spec.executables = []
|
12
|
+
|
13
|
+
spec.require_path = "lib"
|
14
|
+
|
15
|
+
spec.has_rdoc = true
|
16
|
+
spec.test_files = nil
|
17
|
+
#spec.add_dependency 'lib', '>= version'
|
18
|
+
#spec.add_dependency 'fattr'
|
19
|
+
|
20
|
+
spec.extensions.push(*[])
|
21
|
+
|
22
|
+
spec.rubyforge_project = "codeforpeople"
|
23
|
+
spec.author = "Ara T. Howard"
|
24
|
+
spec.email = "ara.t.howard@gmail.com"
|
25
|
+
spec.homepage = "http://github.com/ahoward/shared/tree/master"
|
26
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shared
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ara T. Howard
|
@@ -9,19 +9,10 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-28 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: fattr
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
14
|
+
dependencies: []
|
15
|
+
|
25
16
|
description:
|
26
17
|
email: ara.t.howard@gmail.com
|
27
18
|
executables: []
|
@@ -31,22 +22,14 @@ extensions: []
|
|
31
22
|
extra_rdoc_files: []
|
32
23
|
|
33
24
|
files:
|
34
|
-
- a.rb
|
35
|
-
- ann-shared-0.4.2.txt
|
36
|
-
- gemspec.rb
|
37
|
-
- gen_readme.rb
|
38
|
-
- install.rb
|
39
25
|
- lib
|
40
26
|
- lib/shared.rb
|
27
|
+
- Rakefile
|
41
28
|
- README
|
42
|
-
-
|
43
|
-
-
|
44
|
-
|
45
|
-
|
46
|
-
- samples/d.rb
|
47
|
-
- samples/e.rb
|
48
|
-
has_rdoc: false
|
49
|
-
homepage: http://codeforpeople.com/lib/ruby/shared/
|
29
|
+
- readme.erb
|
30
|
+
- shared.gemspec
|
31
|
+
has_rdoc: true
|
32
|
+
homepage: http://github.com/ahoward/shared/tree/master
|
50
33
|
post_install_message:
|
51
34
|
rdoc_options: []
|
52
35
|
|
data/a.rb
DELETED
data/ann-shared-0.4.2.txt
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
NAME
|
2
|
-
shared.rb
|
3
|
-
|
4
|
-
DESCRIPTION
|
5
|
-
super simple super power sharing of instance and class level code
|
6
|
-
|
7
|
-
INSTALL
|
8
|
-
gem install shared
|
9
|
-
|
10
|
-
URIS
|
11
|
-
http://rubyforge.org/projects/codeforpeople
|
12
|
-
http://codeforpeople.com/lib/ruby/
|
13
|
-
|
14
|
-
HISTORY
|
15
|
-
0.4.2
|
16
|
-
initial version
|
17
|
-
|
18
|
-
SAMPLES
|
19
|
-
|
20
|
-
<========< samples/a.rb >========>
|
21
|
-
|
22
|
-
~ > cat samples/a.rb
|
23
|
-
|
24
|
-
# shared.rb is a very simple and very powerful method of sharing code between
|
25
|
-
# classes.
|
26
|
-
#
|
27
|
-
require 'shared'
|
28
|
-
|
29
|
-
shared(:code) do
|
30
|
-
def classname() self.class.name end
|
31
|
-
end
|
32
|
-
|
33
|
-
class Foo
|
34
|
-
include shared(:code)
|
35
|
-
end
|
36
|
-
|
37
|
-
class Bar
|
38
|
-
include shared(:code)
|
39
|
-
end
|
40
|
-
|
41
|
-
p Foo.new.classname #=> "Foo"
|
42
|
-
|
43
|
-
p Bar.new.classname #=> "Bar"
|
44
|
-
|
45
|
-
~ > ruby samples/a.rb
|
46
|
-
|
47
|
-
"Foo"
|
48
|
-
"Bar"
|
49
|
-
|
50
|
-
|
51
|
-
<========< samples/b.rb >========>
|
52
|
-
|
53
|
-
~ > cat samples/b.rb
|
54
|
-
|
55
|
-
# shared.rb allows natural declaration of both instance and class-level
|
56
|
-
# methods - it's more than simple module inclusion
|
57
|
-
#
|
58
|
-
|
59
|
-
require 'shared'
|
60
|
-
|
61
|
-
shared('methods') do
|
62
|
-
def self.class_method() 40 end
|
63
|
-
|
64
|
-
def instance_method() 2 end
|
65
|
-
end
|
66
|
-
|
67
|
-
class C
|
68
|
-
include shared('methods')
|
69
|
-
end
|
70
|
-
|
71
|
-
p(C.class_method + C.new.instance_method) #=> 42
|
72
|
-
|
73
|
-
|
74
|
-
~ > ruby samples/b.rb
|
75
|
-
|
76
|
-
42
|
77
|
-
|
78
|
-
|
79
|
-
<========< samples/c.rb >========>
|
80
|
-
|
81
|
-
~ > cat samples/c.rb
|
82
|
-
|
83
|
-
# shared.rb works equally well with individual objects in addition to the
|
84
|
-
# normal class level usage
|
85
|
-
#
|
86
|
-
|
87
|
-
require 'shared'
|
88
|
-
|
89
|
-
shared(:meta_tools) do
|
90
|
-
def singleton_class &block
|
91
|
-
singleton_class =
|
92
|
-
class << self
|
93
|
-
self
|
94
|
-
end
|
95
|
-
block ? singleton_class.module_eval(&block) : singleton_class
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
a = %w( a b c )
|
100
|
-
|
101
|
-
a.extend shared(:meta_tools)
|
102
|
-
|
103
|
-
a.singleton_class do
|
104
|
-
def to_range() first .. last end
|
105
|
-
end
|
106
|
-
|
107
|
-
p a.to_range #=> "a".."c"
|
108
|
-
|
109
|
-
~ > ruby samples/c.rb
|
110
|
-
|
111
|
-
"a".."c"
|
112
|
-
|
113
|
-
|
114
|
-
<========< samples/d.rb >========>
|
115
|
-
|
116
|
-
~ > cat samples/d.rb
|
117
|
-
|
118
|
-
# an example use-case for shared.rb is sharing code bewteen classes that
|
119
|
-
# require both class level and instance level behaviour to be shared
|
120
|
-
#
|
121
|
-
|
122
|
-
require 'shared'
|
123
|
-
|
124
|
-
shared(:acts_as_named) do
|
125
|
-
validates_precence_of :name
|
126
|
-
|
127
|
-
def to_html() "<blink> #{ name } </blink>" end
|
128
|
-
end
|
129
|
-
|
130
|
-
class Model
|
131
|
-
def Model.validates_precence_of(*a) end
|
132
|
-
|
133
|
-
def name() 'zaphod' end
|
134
|
-
|
135
|
-
include shared(:acts_as_named)
|
136
|
-
end
|
137
|
-
|
138
|
-
p Model.new.to_html #=> "<blink> zaphod </blink>"
|
139
|
-
|
140
|
-
~ > ruby samples/d.rb
|
141
|
-
|
142
|
-
"<blink> zaphod </blink>"
|
143
|
-
|
144
|
-
|
145
|
-
<========< samples/e.rb >========>
|
146
|
-
|
147
|
-
~ > cat samples/e.rb
|
148
|
-
|
149
|
-
# it's important to note that the shared code is injected into the reciever
|
150
|
-
# fresh on each call and, in that way, the effect is rather macro like
|
151
|
-
#
|
152
|
-
|
153
|
-
require 'shared'
|
154
|
-
|
155
|
-
share(:instance_tracker) do
|
156
|
-
const_set :Instances, []
|
157
|
-
|
158
|
-
def self.instances() const_get :Instances end
|
159
|
-
|
160
|
-
def self.new *a, &b
|
161
|
-
obj = super
|
162
|
-
ensure
|
163
|
-
instances << obj
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
class Foo
|
168
|
-
include shared(:instance_tracker)
|
169
|
-
end
|
170
|
-
|
171
|
-
class Bar
|
172
|
-
include shared(:instance_tracker)
|
173
|
-
end
|
174
|
-
|
175
|
-
2.times{ Foo.new }
|
176
|
-
40.times{ Bar.new }
|
177
|
-
|
178
|
-
p(Foo.instances.size + Bar.instances.size)
|
179
|
-
|
180
|
-
~ > ruby samples/e.rb
|
181
|
-
|
182
|
-
42
|
183
|
-
|
data/gemspec.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
#! /usr/bin/env gem build
|
2
|
-
|
3
|
-
lib, version = File::basename(File::dirname(File::expand_path(__FILE__))).split %r/-/, 2
|
4
|
-
|
5
|
-
require 'rubygems'
|
6
|
-
|
7
|
-
Gem::Specification::new do |spec|
|
8
|
-
$VERBOSE = nil
|
9
|
-
|
10
|
-
shiteless = lambda do |list|
|
11
|
-
list.delete_if do |file|
|
12
|
-
file =~ %r/\.svn/ or
|
13
|
-
file =~ %r/\.tmp/
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
spec.name = lib
|
18
|
-
spec.version = version
|
19
|
-
spec.platform = Gem::Platform::RUBY
|
20
|
-
spec.summary = lib
|
21
|
-
|
22
|
-
spec.files = shiteless[Dir::glob("**/**")]
|
23
|
-
spec.executables = shiteless[Dir::glob("bin/*")].map{|exe| File::basename exe}
|
24
|
-
|
25
|
-
spec.require_path = "lib"
|
26
|
-
|
27
|
-
spec.has_rdoc = File::exist? "doc"
|
28
|
-
spec.test_suite_file = "test/#{ lib }.rb" if File::directory? "test"
|
29
|
-
#spec.add_dependency 'lib', '>= version'
|
30
|
-
spec.add_dependency 'fattr'
|
31
|
-
|
32
|
-
spec.extensions << "extconf.rb" if File::exists? "extconf.rb"
|
33
|
-
|
34
|
-
spec.rubyforge_project = 'codeforpeople'
|
35
|
-
spec.author = "Ara T. Howard"
|
36
|
-
spec.email = "ara.t.howard@gmail.com"
|
37
|
-
spec.homepage = "http://codeforpeople.com/lib/ruby/#{ lib }/"
|
38
|
-
end
|
data/gen_readme.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
#! /usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'pathname'
|
4
|
-
|
5
|
-
$VERBOSE=nil
|
6
|
-
|
7
|
-
def indent s, n = 2
|
8
|
-
ws = ' ' * n
|
9
|
-
s.gsub %r/^/, ws
|
10
|
-
end
|
11
|
-
|
12
|
-
template = IO::read 'README.tmpl'
|
13
|
-
|
14
|
-
samples = ''
|
15
|
-
prompt = '~ > '
|
16
|
-
|
17
|
-
Dir['sample*/*'].sort.each do |sample|
|
18
|
-
samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
|
19
|
-
|
20
|
-
cmd = "cat #{ sample }"
|
21
|
-
samples << indent(prompt + cmd, 2) << "\n\n"
|
22
|
-
samples << indent(`#{ cmd }`, 4) << "\n"
|
23
|
-
|
24
|
-
cmd = "ruby #{ sample }"
|
25
|
-
samples << indent(prompt + cmd, 2) << "\n\n"
|
26
|
-
|
27
|
-
cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib #{ sample })'"
|
28
|
-
#cmd = "ruby -Ilib #{ sample }"
|
29
|
-
samples << indent(`#{ cmd } 2>&1`, 4) << "\n"
|
30
|
-
end
|
31
|
-
|
32
|
-
#samples.gsub! %r/^/, ' '
|
33
|
-
|
34
|
-
readme = template.gsub %r/^\s*@samples\s*$/, samples
|
35
|
-
print readme
|
data/install.rb
DELETED
@@ -1,214 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'rbconfig'
|
3
|
-
require 'find'
|
4
|
-
require 'ftools'
|
5
|
-
require 'tempfile'
|
6
|
-
include Config
|
7
|
-
|
8
|
-
LIBDIR = "lib"
|
9
|
-
LIBDIR_MODE = 0644
|
10
|
-
|
11
|
-
BINDIR = "bin"
|
12
|
-
BINDIR_MODE = 0755
|
13
|
-
|
14
|
-
|
15
|
-
$srcdir = CONFIG["srcdir"]
|
16
|
-
$version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
|
17
|
-
$libdir = File.join(CONFIG["libdir"], "ruby", $version)
|
18
|
-
$archdir = File.join($libdir, CONFIG["arch"])
|
19
|
-
$site_libdir = $:.find {|x| x =~ /site_ruby$/}
|
20
|
-
$bindir = CONFIG["bindir"] || CONFIG['BINDIR']
|
21
|
-
$ruby_install_name = CONFIG['ruby_install_name'] || CONFIG['RUBY_INSTALL_NAME'] || 'ruby'
|
22
|
-
$ruby_ext = CONFIG['EXEEXT'] || ''
|
23
|
-
$ruby = File.join($bindir, ($ruby_install_name + $ruby_ext))
|
24
|
-
|
25
|
-
if !$site_libdir
|
26
|
-
$site_libdir = File.join($libdir, "site_ruby")
|
27
|
-
elsif $site_libdir !~ %r/#{Regexp.quote($version)}/
|
28
|
-
$site_libdir = File.join($site_libdir, $version)
|
29
|
-
end
|
30
|
-
|
31
|
-
def install_rb(srcdir=nil, destdir=nil, mode=nil, bin=nil)
|
32
|
-
#{{{
|
33
|
-
path = []
|
34
|
-
dir = []
|
35
|
-
Find.find(srcdir) do |f|
|
36
|
-
next unless FileTest.file?(f)
|
37
|
-
next if (f = f[srcdir.length+1..-1]) == nil
|
38
|
-
next if (/CVS$/ =~ File.dirname(f))
|
39
|
-
next if (/\.svn/ =~ File.dirname(f))
|
40
|
-
next if f =~ %r/\.lnk/
|
41
|
-
next if f =~ %r/\.svn/
|
42
|
-
next if f =~ %r/\.swp/
|
43
|
-
next if f =~ %r/\.svn/
|
44
|
-
path.push f
|
45
|
-
dir |= [File.dirname(f)]
|
46
|
-
end
|
47
|
-
for f in dir
|
48
|
-
next if f == "."
|
49
|
-
next if f == "CVS"
|
50
|
-
File::makedirs(File.join(destdir, f))
|
51
|
-
end
|
52
|
-
for f in path
|
53
|
-
next if (/\~$/ =~ f)
|
54
|
-
next if (/^\./ =~ File.basename(f))
|
55
|
-
unless bin
|
56
|
-
File::install(File.join(srcdir, f), File.join(destdir, f), mode, true)
|
57
|
-
else
|
58
|
-
from = File.join(srcdir, f)
|
59
|
-
to = File.join(destdir, f)
|
60
|
-
shebangify(from) do |sf|
|
61
|
-
$deferr.print from, " -> ", File::catname(from, to), "\n"
|
62
|
-
$deferr.printf "chmod %04o %s\n", mode, to
|
63
|
-
File::install(sf, to, mode, false)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
#}}}
|
68
|
-
end
|
69
|
-
def shebangify f
|
70
|
-
#{{{
|
71
|
-
open(f) do |fd|
|
72
|
-
buf = fd.read 42
|
73
|
-
if buf =~ %r/^\s*#\s*!.*ruby/o
|
74
|
-
ftmp = Tempfile::new("#{ $$ }_#{ File::basename(f) }")
|
75
|
-
begin
|
76
|
-
fd.rewind
|
77
|
-
ftmp.puts "#!#{ $ruby }"
|
78
|
-
while((buf = fd.read(8192)))
|
79
|
-
ftmp.write buf
|
80
|
-
end
|
81
|
-
ftmp.close
|
82
|
-
yield ftmp.path
|
83
|
-
ensure
|
84
|
-
ftmp.close!
|
85
|
-
end
|
86
|
-
else
|
87
|
-
yield f
|
88
|
-
end
|
89
|
-
end
|
90
|
-
#}}}
|
91
|
-
end
|
92
|
-
def ARGV.switch
|
93
|
-
#{{{
|
94
|
-
return nil if self.empty?
|
95
|
-
arg = self.shift
|
96
|
-
return nil if arg == '--'
|
97
|
-
if arg =~ /^-(.)(.*)/
|
98
|
-
return arg if $1 == '-'
|
99
|
-
raise 'unknown switch "-"' if $2.index('-')
|
100
|
-
self.unshift "-#{$2}" if $2.size > 0
|
101
|
-
"-#{$1}"
|
102
|
-
else
|
103
|
-
self.unshift arg
|
104
|
-
nil
|
105
|
-
end
|
106
|
-
#}}}
|
107
|
-
end
|
108
|
-
def ARGV.req_arg
|
109
|
-
#{{{
|
110
|
-
self.shift || raise('missing argument')
|
111
|
-
#}}}
|
112
|
-
end
|
113
|
-
def linkify d, linked = []
|
114
|
-
#--{{{
|
115
|
-
if test ?d, d
|
116
|
-
versioned = Dir[ File::join(d, "*-[0-9].[0-9].[0-9].rb") ]
|
117
|
-
versioned.each do |v|
|
118
|
-
src, dst = v, v.gsub(%r/\-[\d\.]+\.rb$/, '.rb')
|
119
|
-
lnk = nil
|
120
|
-
begin
|
121
|
-
if test ?l, dst
|
122
|
-
lnk = "#{ dst }.lnk"
|
123
|
-
puts "#{ dst } -> #{ lnk }"
|
124
|
-
File::rename dst, lnk
|
125
|
-
end
|
126
|
-
unless test ?e, dst
|
127
|
-
puts "#{ src } -> #{ dst }"
|
128
|
-
File::copy src, dst
|
129
|
-
linked << dst
|
130
|
-
end
|
131
|
-
ensure
|
132
|
-
if lnk
|
133
|
-
at_exit do
|
134
|
-
puts "#{ lnk } -> #{ dst }"
|
135
|
-
File::rename lnk, dst
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
linked
|
142
|
-
#--}}}
|
143
|
-
end
|
144
|
-
|
145
|
-
|
146
|
-
#
|
147
|
-
# main program
|
148
|
-
#
|
149
|
-
|
150
|
-
libdir = $site_libdir
|
151
|
-
bindir = $bindir
|
152
|
-
no_linkify = false
|
153
|
-
linked = nil
|
154
|
-
help = false
|
155
|
-
|
156
|
-
usage = <<-usage
|
157
|
-
#{ File::basename $0 }
|
158
|
-
-d, --destdir <destdir>
|
159
|
-
-l, --libdir <libdir>
|
160
|
-
-b, --bindir <bindir>
|
161
|
-
-r, --ruby <ruby>
|
162
|
-
-n, --no_linkify
|
163
|
-
-s, --sudo
|
164
|
-
-h, --help
|
165
|
-
usage
|
166
|
-
|
167
|
-
begin
|
168
|
-
while switch = ARGV.switch
|
169
|
-
case switch
|
170
|
-
when '-d', '--destdir'
|
171
|
-
libdir = ARGV.req_arg
|
172
|
-
when '-l', '--libdir'
|
173
|
-
libdir = ARGV.req_arg
|
174
|
-
when '-b', '--bindir'
|
175
|
-
bindir = ARGV.req_arg
|
176
|
-
when '-r', '--ruby'
|
177
|
-
$ruby = ARGV.req_arg
|
178
|
-
when '-n', '--no_linkify'
|
179
|
-
no_linkify = true
|
180
|
-
when '-s', '--sudo'
|
181
|
-
sudo = 'sudo'
|
182
|
-
when '-h', '--help'
|
183
|
-
help = true
|
184
|
-
else
|
185
|
-
raise "unknown switch #{switch.dump}"
|
186
|
-
end
|
187
|
-
end
|
188
|
-
rescue
|
189
|
-
STDERR.puts $!.to_s
|
190
|
-
STDERR.puts usage
|
191
|
-
exit 1
|
192
|
-
end
|
193
|
-
|
194
|
-
if help
|
195
|
-
STDOUT.puts usage
|
196
|
-
exit
|
197
|
-
end
|
198
|
-
|
199
|
-
system "#{ sudo } #{ $ruby } pre-install.rb" if test(?s, 'pre-install.rb')
|
200
|
-
|
201
|
-
unless no_linkify
|
202
|
-
linked = linkify('lib') + linkify('bin')
|
203
|
-
end
|
204
|
-
|
205
|
-
system "#{ $ruby } extconf.rb && make && #{ sudo } make install" if test(?s, 'extconf.rb')
|
206
|
-
|
207
|
-
install_rb(LIBDIR, libdir, LIBDIR_MODE)
|
208
|
-
install_rb(BINDIR, bindir, BINDIR_MODE, bin=true)
|
209
|
-
|
210
|
-
if linked
|
211
|
-
linked.each{|path| File::rm_f path}
|
212
|
-
end
|
213
|
-
|
214
|
-
system "#{ sudo } #{ $ruby } post-install.rb" if test(?s, 'post-install.rb')
|
data/samples/a.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# shared.rb is a very simple and very powerful method of sharing code between
|
2
|
-
# classes.
|
3
|
-
#
|
4
|
-
require 'shared'
|
5
|
-
|
6
|
-
shared(:code) do
|
7
|
-
def classname() self.class.name end
|
8
|
-
end
|
9
|
-
|
10
|
-
class Foo
|
11
|
-
include shared(:code)
|
12
|
-
end
|
13
|
-
|
14
|
-
class Bar
|
15
|
-
include shared(:code)
|
16
|
-
end
|
17
|
-
|
18
|
-
p Foo.new.classname #=> "Foo"
|
19
|
-
|
20
|
-
p Bar.new.classname #=> "Bar"
|
data/samples/b.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# shared.rb allows natural declaration of both instance and class-level
|
2
|
-
# methods - it's more than simple module inclusion
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'shared'
|
6
|
-
|
7
|
-
shared('methods') do
|
8
|
-
def self.class_method() 40 end
|
9
|
-
|
10
|
-
def instance_method() 2 end
|
11
|
-
end
|
12
|
-
|
13
|
-
class C
|
14
|
-
include shared('methods')
|
15
|
-
end
|
16
|
-
|
17
|
-
p(C.class_method + C.new.instance_method) #=> 42
|
18
|
-
|
data/samples/c.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# shared.rb works equally well with individual objects in addition to the
|
2
|
-
# normal class level usage
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'shared'
|
6
|
-
|
7
|
-
shared(:meta_tools) do
|
8
|
-
def singleton_class &block
|
9
|
-
singleton_class =
|
10
|
-
class << self
|
11
|
-
self
|
12
|
-
end
|
13
|
-
block ? singleton_class.module_eval(&block) : singleton_class
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
a = %w( a b c )
|
18
|
-
|
19
|
-
a.extend shared(:meta_tools)
|
20
|
-
|
21
|
-
a.singleton_class do
|
22
|
-
def to_range() first .. last end
|
23
|
-
end
|
24
|
-
|
25
|
-
p a.to_range #=> "a".."c"
|
data/samples/d.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# an example use-case for shared.rb is sharing code bewteen classes that
|
2
|
-
# require both class level and instance level behaviour to be shared
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'shared'
|
6
|
-
|
7
|
-
shared(:acts_as_named) do
|
8
|
-
validates_precence_of :name
|
9
|
-
|
10
|
-
def to_html() "<blink> #{ name } </blink>" end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Model
|
14
|
-
def Model.validates_precence_of(*a) end
|
15
|
-
|
16
|
-
def name() 'zaphod' end
|
17
|
-
|
18
|
-
include shared(:acts_as_named)
|
19
|
-
end
|
20
|
-
|
21
|
-
p Model.new.to_html #=> "<blink> zaphod </blink>"
|
data/samples/e.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# it's important to note that the shared code is injected into the reciever
|
2
|
-
# fresh on each call and, in that way, the effect is rather macro like
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'shared'
|
6
|
-
|
7
|
-
share(:instance_tracker) do
|
8
|
-
const_set :Instances, []
|
9
|
-
|
10
|
-
def self.instances() const_get :Instances end
|
11
|
-
|
12
|
-
def self.new *a, &b
|
13
|
-
obj = super
|
14
|
-
ensure
|
15
|
-
instances << obj
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class Foo
|
20
|
-
include shared(:instance_tracker)
|
21
|
-
end
|
22
|
-
|
23
|
-
class Bar
|
24
|
-
include shared(:instance_tracker)
|
25
|
-
end
|
26
|
-
|
27
|
-
2.times{ Foo.new }
|
28
|
-
40.times{ Bar.new }
|
29
|
-
|
30
|
-
p(Foo.instances.size + Bar.instances.size)
|