attic 0.5.3 → 0.6.pre.RC1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cab1b37cf99fda2d7f47b898c998af908e2c8f4dcdde31ae66cd34d7c337a993
4
+ data.tar.gz: 7d579f1320f3493b6639705d316aaf1197f77aa20894ecff84abd0a34a162124
5
+ SHA512:
6
+ metadata.gz: 920f145e1b3eb27151653a69be076fe3224c82e2781695209e2017ac4634708855dc0331ad254a9765bd185f25e566b1c6a712bc6118668c201ec0fa240239fc
7
+ data.tar.gz: e0e4204bd76ae3f76c7c3a51166c278f69b2152db651a2ccd28ce8d559f281bfbf18e253713608fad2d9d488b96f52d3397070de7cc606842c3f47971db1276a
@@ -1,48 +1,54 @@
1
- = Attic - v0.5
1
+ # Attic - v0.6-RC1 (2021-07-01)
2
2
 
3
3
  A place to hide private instance variables in your Ruby objects.
4
4
 
5
- == Example
5
+ ## Example
6
6
 
7
+ ```ruby
7
8
  require 'attic'
8
-
9
+
9
10
  class String
10
11
  extend Attic
11
12
  attic :timestamp
12
13
  end
13
-
14
+
14
15
  a = "anything"
15
16
  a.timestamp = "1980-11-18"
16
17
  a.instance_variables # => []
17
18
  a.timestamp # 1980-11-18
18
-
19
+
19
20
  a.attic_variables # => [:timestamp]
20
-
21
+
21
22
  a.attic_variable_set :tags, [:a, :b, :c]
22
23
  a.attic_variable_get :tags # [:a, :b, :c]
23
-
24
+
24
25
  a.attic_variables # => [:timestamp, :tags]
25
-
26
- == Some objects have no metaclasses
26
+ ```
27
+
28
+ ## Some objects have no metaclasses
27
29
 
28
- Symbol and Fixnum objects do not have metaclasses so instance variables are hidden in the object itself.
30
+ Symbol objects do not have metaclasses so instance variables are hidden in the object itself.
29
31
 
30
32
 
31
- == Installation
33
+ ## Installation
32
34
 
33
35
  Via Rubygems, one of:
34
36
 
37
+ ```shell
35
38
  $ gem install attic
39
+ ```
36
40
 
37
41
  or via download:
38
42
  * attic-latest.tar.gz[http://github.com/delano/attic/tarball/latest]
39
43
  * attic-latest.zip[http://github.com/delano/attic/zipball/latest]
40
44
 
41
45
 
42
- == Credits
46
+ ## Credits
47
+
48
+ * `gems@solutious.com` (@delano)
49
+
43
50
 
44
- * Delano (@solutious.com)
51
+ ## License
45
52
 
46
- == License
53
+ MIT
47
54
 
48
- See: LICENSE.txt
data/Rakefile CHANGED
@@ -1,25 +1,16 @@
1
1
  require 'rubygems'
2
2
  require 'rake/clean'
3
- require 'rake/gempackagetask'
3
+ require 'rubygems/package_task'
4
4
  require 'fileutils'
5
+ require 'rdoc/task'
5
6
  include FileUtils
6
-
7
-
8
- begin
9
- require 'hanna/rdoctask'
10
- rescue LoadError
11
- require 'rake/rdoctask'
12
- end
13
-
14
7
 
15
8
  task :default => :package
16
-
9
+
17
10
  # CONFIG =============================================================
18
11
 
19
12
  # Change the following according to your needs
20
- README = "README.rdoc"
21
- CHANGES = "CHANGES.txt"
22
- LICENSE = "LICENSE.txt"
13
+ README = "README.md"
23
14
 
24
15
  # Files and directories to be deleted when you run "rake clean"
25
16
  CLEAN.include [ 'pkg', '*.gem', '.config']
@@ -30,7 +21,7 @@ load "#{name}.gemspec"
30
21
  version = @spec.version
31
22
 
32
23
  # That's it! The following defaults should allow you to get started
33
- # on other things.
24
+ # on other things.
34
25
 
35
26
 
36
27
  # TESTS/SPECS =========================================================
@@ -39,7 +30,7 @@ version = @spec.version
39
30
 
40
31
  # INSTALL =============================================================
41
32
 
42
- Rake::GemPackageTask.new(@spec) do |p|
33
+ Gem::PackageTask.new(@spec) do |p|
43
34
  p.need_tar = true if RUBY_PLATFORM !~ /mswin/
44
35
  end
45
36
 
@@ -52,25 +43,6 @@ task :uninstall => [ :clean ] do
52
43
  end
53
44
 
54
45
 
55
- # RUBYFORGE RELEASE / PUBLISH TASKS ==================================
56
-
57
- if @spec.rubyforge_project
58
- desc 'Publish website to rubyforge'
59
- task 'publish:rdoc' => 'doc/index.html' do
60
- sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
61
- end
62
-
63
- desc 'Public release to rubyforge'
64
- task 'publish:gem' => [:package] do |t|
65
- sh <<-end
66
- rubyforge add_release -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
67
- rubyforge add_file -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
68
- end
69
- end
70
- end
71
-
72
-
73
-
74
46
  # RUBY DOCS TASK ==================================
75
47
 
76
48
  Rake::RDocTask.new do |t|
@@ -78,10 +50,7 @@ Rake::RDocTask.new do |t|
78
50
  t.title = @spec.summary
79
51
  t.options << '--line-numbers' << '-A cattr_accessor=object'
80
52
  t.options << '--charset' << 'utf-8'
81
- t.rdoc_files.include(LICENSE)
82
53
  t.rdoc_files.include(README)
83
- t.rdoc_files.include(CHANGES)
84
- #t.rdoc_files.include('bin/*')
85
54
  t.rdoc_files.include('lib/**/*.rb')
86
55
  end
87
56
 
data/attic.gemspec CHANGED
@@ -1,52 +1,20 @@
1
1
  @spec = Gem::Specification.new do |s|
2
2
  s.name = "attic"
3
- s.rubyforge_project = "attic"
4
- s.version = "0.5.3"
5
- s.summary = "A place to hide private instance variables in your Ruby objects."
6
- s.description = s.summary
3
+ s.version = "0.6-RC1"
4
+ s.summary = "When in doubt, store it in the attic"
5
+ s.description = "Attic: a place to hide metadata about the class or variable itself (e.g. SHA hash summaries)."
7
6
  s.author = "Delano Mandelbaum"
8
- s.email = "delano@solutious.com"
7
+ s.email = "gems@solutious.com"
9
8
  s.homepage = "http://github.com/delano/attic"
10
-
11
- # = EXECUTABLES =
12
- # The list of executables in your project (if any). Don't include the path,
13
- # just the base filename.
14
9
  s.executables = %w[]
15
-
16
- # Directories to extract rdocs from
17
- s.require_paths = %w[lib]
18
-
19
- # Specific files to include rdocs from
20
- s.extra_rdoc_files = %w[README.rdoc LICENSE.txt CHANGES.txt]
21
-
22
- # Update --main to reflect the default page to display
23
- s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.rdoc"]
24
-
25
- # = MANIFEST =
26
- # The complete list of files to be included in the release. When GitHub packages your gem,
27
- # it doesn't allow you to run any command that accesses the filesystem. You will get an
28
- # error. You can ask your VCS for the list of versioned files:
29
- # git ls-files
30
- # svn list -R
10
+ s.require_paths = %w[lib]
11
+ s.extra_rdoc_files = %w[README.md]
12
+ s.licenses = ["MIT"] # https://spdx.org/licenses/MIT-Modern-Variant.html
13
+ s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.md"]
31
14
  s.files = %w(
32
- CHANGES.txt
33
- LICENSE.txt
34
- README.rdoc
35
- Rakefile
36
- attic.gemspec
37
- lib/attic.rb
38
- try/01_mixins_tryouts.rb
39
- try/10_attic_tryouts.rb
40
- try/20_accessing_tryouts.rb
41
- try/25_string_tryouts.rb
42
- try/30_nometaclass_tryouts.rb
43
- try/40_explicit_accessor_tryouts.rb
44
- try/X1_metaclasses.rb
45
- try/X2_extending.rb
15
+ README.md
16
+ Rakefile
17
+ attic.gemspec
18
+ lib/attic.rb
46
19
  )
47
-
48
- s.has_rdoc = true
49
- s.rubygems_version = '1.3.0'
50
-
51
-
52
- end
20
+ end
data/lib/attic.rb CHANGED
@@ -4,80 +4,96 @@ end
4
4
 
5
5
  # = Object
6
6
  #
7
- # These methods are copied directly from _why's metaid.rb.
7
+ # These methods are copied directly from _why's metaid.rb.
8
8
  # See: http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
9
9
  class Object
10
-
10
+
11
11
  unless defined?(::Object::NOMETACLASS)
12
12
  # An Array of classes which do not have metaclasses.
13
- NOMETACLASS = [Symbol, Fixnum].freeze
13
+ NOMETACLASS = [Symbol, Integer]
14
14
  end
15
-
15
+
16
16
  def nometaclass?
17
17
  NOMETACLASS.member?(self)
18
18
  end
19
-
19
+
20
20
  def metaclass?
21
21
  !NOMETACLASS.member?(self.class)
22
22
  end
23
-
23
+
24
24
  # A convenient method for getting the metaclass of the current object.
25
25
  # i.e.
26
26
  #
27
27
  # class << self; self; end;
28
28
  #
29
- # NOTE: Some Ruby class do not have meta classes (see: NOMETACLASS).
29
+ # NOTE: Some Ruby class do not have meta classes (see: NOMETACLASS).
30
30
  # For these classes, this method returns the class itself. That means
31
- # the instance variables will stored in the class itself.
31
+ # the instance variables will be stored in the class itself.
32
32
  def metaclass
33
- if !self.metaclass?
34
- raise NoMetaClass, self
33
+ if self.metaclass?
34
+ class << self
35
+ self
36
+ end
35
37
  else
36
- class << self; self; end;
38
+ self
39
+ end
40
+ end
41
+
42
+ def metaclassfly
43
+ location = self.class
44
+ attr_name = "@@_attic_#{self.object_id}"
45
+ unless location.class_variable_defined? attr_name
46
+ location.class_variable_set attr_name, Class.new
37
47
  end
48
+ location.class_variable_get attr_name
38
49
  end
39
-
50
+
40
51
  # Execute a block +&blk+ within the metaclass of the current object.
41
- def meta_eval &blk; metaclass.instance_eval &blk; end
42
-
52
+ def meta_eval &blk
53
+ metaclass.instance_eval blk
54
+ end
55
+
43
56
  # Add an instance method called +name+ to metaclass for the current object.
44
57
  # This is useful because it will be available as a singleton method
45
- # to all subclasses too.
58
+ # to all subclasses too.
46
59
  def meta_def name, &blk
47
60
  meta_eval { define_method name, &blk }
48
61
  end
49
-
62
+
50
63
  # Add a class method called +name+ for the current object's class. This
51
- # isn't so special but it maintains consistency with meta_def.
64
+ # isn't so special but it maintains consistency with meta_def.
52
65
  def class_def name, &blk
53
66
  class_eval { define_method name, &blk }
54
67
  end
55
68
 
56
-
69
+
57
70
  # A convenient method for getting the metaclass of the metaclass
58
71
  # i.e.
59
72
  #
60
73
  # self.metaclass.metaclass
61
74
  #
62
- def metametaclass; self.metaclass.metaclass; end
75
+ def metametaclass
76
+ self.metaclass.metaclass
77
+ end
63
78
 
64
- def metameta_eval &blk; metametaclass.instance_eval &blk; end
79
+ def metameta_eval &blk
80
+ metametaclass.instance_eval blk
81
+ end
65
82
 
66
83
  def metameta_def name, &blk
67
84
  metameta_eval { define_method name, &blk }
68
85
  end
69
-
70
86
  end
71
87
 
72
88
 
73
89
 
74
90
  # = Attic
75
91
  #
76
- # A place to store instance variables.
92
+ # A place to store instance variables.
77
93
  #
78
94
  module Attic
79
- VERSION = '0.5.3' unless defined?(VERSION)
80
-
95
+ VERSION = '0.6-RC1' unless defined?(VERSION)
96
+
81
97
  module InstanceMethods
82
98
  def attic_variables
83
99
  self.class.attic_variables
@@ -88,43 +104,31 @@ module Attic
88
104
  end
89
105
  def attic_variable_set(n,v)
90
106
  attic_variables << n unless attic_variable? n
91
- if metaclass?
92
- metaclass.instance_variable_set("@#{n}", v)
93
- else
94
- instance_variable_set("@___attic_#{n}", v)
95
- end
107
+ # binding.pry
108
+ metaclassfly.instance_variable_set("@___attic_#{n}", v)
96
109
  end
97
110
  def attic_variable_get(n)
98
- if metaclass?
99
- metaclass.instance_variable_get("@#{n}")
100
- else
101
- instance_variable_get("@___attic_#{n}")
102
- end
111
+ metaclassfly.instance_variable_get("@___attic_#{n}")
112
+ end
113
+ def get_binding
114
+ binding
103
115
  end
104
116
  end
105
-
117
+
106
118
  def self.included(o)
107
119
  raise "You probably meant to 'extend Attic' in #{o}"
108
120
  end
109
-
121
+
110
122
  def self.extended(o)
111
- # This class has already been extended.
123
+ # This class has already been extended.
112
124
  return if o.ancestors.member? Attic::InstanceMethods
113
-
114
-
115
- ## NOTE: This is just a reminder for a more descerning way to
116
- ## include the meta methods, instead of using a global mixin.
117
- ##o.class_eval do
118
- ## include ObjectHelpers
119
- ##end
120
- # Create an instance method that returns the attic variables.
125
+
126
+ # Add the instance methods for accessing attic variables
121
127
  o.send :include, Attic::InstanceMethods
122
- #p [:extend, self, o]
123
-
128
+
124
129
  o.metaclass.instance_variable_set("@attic_variables", [])
125
130
  o.class_eval do
126
131
  def self.inherited(o2)
127
- #p [:inherit, self, o2]
128
132
  attic_vars = self.attic_variables.clone
129
133
  o2.metaclass.instance_variable_set("@attic_variables", attic_vars)
130
134
  end
@@ -140,20 +144,17 @@ module Attic
140
144
  end
141
145
  end
142
146
  end
143
-
144
-
145
- end
146
-
147
-
148
- # A class method for defining variables to store in the attic.
149
- # * +junk+ is a list of variables names. Accessor methods are
150
- # created for each variable name in the list.
151
- #
147
+ end
148
+
149
+ # A class method for defining variables to store in the attic.
150
+ # * +junk+ is a list of variables names. Accessor methods are
151
+ # created for each variable name in the list.
152
+ #
152
153
  # Returns the list of attic variable names or if not junk was
153
- # given, returns the metaclass.
154
+ # given, returns the metaclass.
154
155
  #
155
156
  # e.g.
156
- #
157
+ #
157
158
  # String.extend Attic
158
159
  # String.attic :timestamp
159
160
  #
@@ -166,7 +167,7 @@ module Attic
166
167
  junk.each do |name|
167
168
  next if attic_variable? name
168
169
  self.attic_variables << name
169
-
170
+
170
171
  unless method_defined? name
171
172
  define_method(name) do
172
173
  attic_variable_get name
@@ -180,8 +181,8 @@ module Attic
180
181
  end
181
182
  attic_vars
182
183
  end
183
-
184
- # Returns an Array of attic variables for the current class.
184
+
185
+ # Returns an Array of attic variables for the current class.
185
186
  # e.g.
186
187
  #
187
188
  # String.extend Attic
@@ -198,7 +199,7 @@ module Attic
198
199
  def attic_variable?(n)
199
200
  attic_variables.member? n
200
201
  end
201
-
202
+
202
203
  end
203
204
 
204
205
  # - Module#instance_method returns an UnboundMethod
metadata CHANGED
@@ -1,86 +1,53 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: attic
3
- version: !ruby/object:Gem::Version
4
- hash: 13
5
- prerelease:
6
- segments:
7
- - 0
8
- - 5
9
- - 3
10
- version: 0.5.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.pre.RC1
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Delano Mandelbaum
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2011-02-11 00:00:00 -05:00
19
- default_executable:
11
+ date: 2021-07-22 00:00:00.000000000 Z
20
12
  dependencies: []
21
-
22
- description: A place to hide private instance variables in your Ruby objects.
23
- email: delano@solutious.com
13
+ description: 'Attic: a place to hide metadata about the class or variable itself (e.g.
14
+ SHA hash summaries).'
15
+ email: gems@solutious.com
24
16
  executables: []
25
-
26
17
  extensions: []
27
-
28
- extra_rdoc_files:
29
- - README.rdoc
30
- - LICENSE.txt
31
- - CHANGES.txt
32
- files:
33
- - CHANGES.txt
34
- - LICENSE.txt
35
- - README.rdoc
18
+ extra_rdoc_files:
19
+ - README.md
20
+ files:
21
+ - README.md
36
22
  - Rakefile
37
23
  - attic.gemspec
38
24
  - lib/attic.rb
39
- - try/01_mixins_tryouts.rb
40
- - try/10_attic_tryouts.rb
41
- - try/20_accessing_tryouts.rb
42
- - try/25_string_tryouts.rb
43
- - try/30_nometaclass_tryouts.rb
44
- - try/40_explicit_accessor_tryouts.rb
45
- - try/X1_metaclasses.rb
46
- - try/X2_extending.rb
47
- has_rdoc: true
48
25
  homepage: http://github.com/delano/attic
49
- licenses: []
50
-
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
51
29
  post_install_message:
52
- rdoc_options:
53
- - --line-numbers
54
- - --title
55
- - A place to hide private instance variables in your Ruby objects.
56
- - --main
57
- - README.rdoc
58
- require_paths:
30
+ rdoc_options:
31
+ - "--line-numbers"
32
+ - "--title"
33
+ - When in doubt, store it in the attic
34
+ - "--main"
35
+ - README.md
36
+ require_paths:
59
37
  - lib
60
- required_ruby_version: !ruby/object:Gem::Requirement
61
- none: false
62
- requirements:
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
63
40
  - - ">="
64
- - !ruby/object:Gem::Version
65
- hash: 3
66
- segments:
67
- - 0
68
- version: "0"
69
- required_rubygems_version: !ruby/object:Gem::Requirement
70
- none: false
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- hash: 3
75
- segments:
76
- - 0
77
- version: "0"
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.1
78
48
  requirements: []
79
-
80
- rubyforge_project: attic
81
- rubygems_version: 1.5.2
49
+ rubygems_version: 3.2.21
82
50
  signing_key:
83
- specification_version: 3
84
- summary: A place to hide private instance variables in your Ruby objects.
51
+ specification_version: 4
52
+ summary: When in doubt, store it in the attic
85
53
  test_files: []
86
-
data/CHANGES.txt DELETED
@@ -1,48 +0,0 @@
1
- ATTIC, CHANGES
2
-
3
- #### 0.5.3 (2011-02-11) ###############################
4
-
5
- * FIXED: Don't redefine Object::NOMETACLASS
6
- * CHANGE: Updated tests to Tryouts 2
7
- * CHANGE: Move attic/mixins content to attic.rb
8
-
9
-
10
- #### 0.5.2 (2010-02-15) ###############################
11
-
12
- * CHANGE: Remove hanna dependency [Diego Elio 'Flameeyes' Pettenò]
13
-
14
- #### 0.5.0 (2009-11-29) ###############################
15
-
16
- * FIXED: Classes can now only be extended once
17
- * FIXED: Don't define the same attic variable more then once
18
- * FIXED: Don't define instance_variable method for objects which
19
- don't already have one.
20
- * CHANGE: attic_vars method is now attic_variables
21
- * CHANGE: Won't define accessor methods if methods with the same
22
- name already exist.
23
- * ADDED: all_instance_variables method (for no metaclasses)
24
- * ADDED: Explicit attic_variable_set and attic_variable_get methods
25
-
26
-
27
- #### 0.4.0 (2009-07-17) ###############################
28
-
29
- * ADDED: Support for objects that don't have metaclasses:
30
- Currently: Symbols, Fixnum
31
- * CHANGE: Objects with no metaclass raise NoMetaClass exception.
32
-
33
-
34
- #### 0.3.1 (2009-07-13) ###############################
35
-
36
- CRIPES! I'd forgotten to update the gemspec.
37
-
38
- #### 0.3 (2009-07-11) ###############################
39
-
40
- NOTE: A complete re-write from 0.2
41
-
42
- * FIXED: Now works on any Object except Symbol and Fixnum
43
- * ADDED: attic_vars method
44
-
45
-
46
- #### 0.2 (2009-07-08) ###############################
47
-
48
- NOTE: Initial public release
data/LICENSE.txt DELETED
@@ -1,19 +0,0 @@
1
- Copyright (c) 2009 Solutious Inc, Delano Mandelbaum
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is
8
- furnished to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in
11
- all copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- THE SOFTWARE.
@@ -1,17 +0,0 @@
1
- require 'attic'
2
-
3
- ## has metaclass", 'Object' do
4
- if Tryouts.sysinfo.ruby.to_s == "1.9.1"
5
- Object.new.metaclass.superclass.to_s
6
- else
7
- 'Object'
8
- end
9
- #=> 'Object'
10
-
11
- ## has metametaclass", '#<Class:Object>' do
12
- if Tryouts.sysinfo.ruby.to_s >= "1.9.1"
13
- Object.new.metaclass.superclass.to_s
14
- else
15
- '#<Class:Object>'
16
- end
17
- #=> 'Object'
@@ -1,41 +0,0 @@
1
- require 'attic'
2
-
3
- ## can extend Attic
4
- class ::Worker
5
- extend Attic
6
- def kind() :true end
7
- end
8
- # 1.9 # 1.8
9
- Worker.methods.member?(:attic) || Worker.methods.member?('attic')
10
- #=> true
11
-
12
- ## can't include Attic raises exception
13
- begin
14
- class ::Worker
15
- include Attic
16
- end
17
- rescue => RuntimeError
18
- :success
19
- end
20
- #=> :success
21
-
22
- ## can define attic attribute
23
- Worker.attic :size
24
- w = Worker.new
25
- #w.attic :size
26
- p Worker.instance_methods(false)
27
- p Worker.methods.sort
28
- w.respond_to? :size
29
- #=> true
30
-
31
- ## can access attic attributes explicitly"
32
- w = Worker.new
33
- w.attic_variable_set :size, 2
34
- w.attic_variable_get :size
35
- #=> 2
36
-
37
- ## won't define a method if on already exists
38
- Worker.attic :kind
39
- a = Worker.new
40
- a.kind
41
- #=> :true
@@ -1,29 +0,0 @@
1
- require 'attic'
2
- class ::Worker
3
- extend Attic
4
- attic :size
5
- end
6
-
7
-
8
- ## save an instance variable the long way
9
- w = Worker.new
10
- w.metametaclass.instance_variable_set '@mattress', 'S&F'
11
- w.metametaclass.instance_variable_get '@mattress'
12
- #=> 'S&F'
13
-
14
- ## save an instance variable the short way
15
- w = Worker.new
16
- w.size = :california_king
17
- w.size
18
- #=> :california_king
19
-
20
- ## new instances don't cross streams
21
- w = Worker.new
22
- w.size
23
- #=> nil
24
-
25
- ## instance variables are hidden
26
- w = Worker.new
27
- w.metametaclass.instance_variable_set '@mattress', 'S&F'
28
- w.instance_variables
29
- ## []
@@ -1,32 +0,0 @@
1
- require 'attic'
2
-
3
- ## String can extend Attic
4
- String.extend Attic
5
- String.respond_to? :attic
6
- #=> true
7
-
8
- ## save an instance variable the long way
9
- s = ""
10
- s.metametaclass.instance_variable_set '@mattress', 'S&F'
11
- s.metametaclass.instance_variable_get '@mattress'
12
- #=> 'S&F'
13
-
14
- ## can create attributes
15
- String.attic :goodies
16
- #=> [:goodies]
17
-
18
- ## save an instance variable the short way
19
- s = ""
20
- s.goodies = :california_king
21
- p s.instance_variables
22
- p s.attic_vars
23
- s.goodies
24
- #=> :california_king
25
-
26
- ## String instances don't cross streams
27
- String.extend Attic
28
- String.attic :name
29
- a = "any"
30
- a.name = :roger
31
- a.name == "".name
32
- #=> false
@@ -1,51 +0,0 @@
1
- require 'attic'
2
-
3
- ## has list of no metaclass classes
4
- Object::NOMETACLASS
5
- #=> [Symbol, Fixnum]
6
-
7
- ## Symbol metaclass raises exception
8
- begin
9
- :any.metaclass
10
- rescue NoMetaClass
11
- :success
12
- end
13
- #=> :success
14
-
15
- ## Symbol instances don't cross streams
16
- Symbol.extend Attic
17
- Symbol.attic :name
18
- a, b = :symbol1, :symbol2
19
- a.name = :roger
20
- [a.name, b.name]
21
- #=> [:roger, nil]
22
-
23
- ## metaclass? method exists
24
- Symbol.extend Attic
25
- :any.respond_to? :metaclass?
26
- #=> true
27
-
28
- ## metaclass? method is false for a Symbol", false do
29
- :any.metaclass?
30
- #=> false
31
-
32
- ## A Symbol's attic vars appear in all_instance_variables" do
33
- Symbol.extend Attic
34
- Symbol.attic :name
35
- a, b = :symbol1, :symbol2
36
- a.name = :roger
37
- a.all_instance_variables
38
- #=> [:@___attic_name]
39
-
40
-
41
- ## A Symbol's attic vars do not appear in instance_variables" do
42
- Symbol.extend Attic
43
- Symbol.attic :name
44
- a, b = :symbol1, :symbol2
45
- a.name = :roger
46
- a.instance_variables
47
- #=> []
48
-
49
- ## knows attic variables", [:name] do
50
- Symbol.attic_variables
51
- #=> [:name]
@@ -1,17 +0,0 @@
1
- require 'attic'
2
-
3
- class ::Worker
4
- extend Attic
5
- end
6
-
7
- ## can set value", 100 do
8
- a = Worker.new
9
- a.attic_variable_set :space, 100
10
- a.attic_variable_get :space
11
- #=> 100
12
-
13
- ## doesn't create accessor methods", false do
14
- a = Worker.new
15
- a.attic_variable_set :space, 100
16
- a.respond_to? :space
17
- #=> false
@@ -1,112 +0,0 @@
1
- # $ ruby tryouts/metaclasses.rb
2
-
3
- class Object
4
-
5
- # A convenient method for getting the metaclass of the current object.
6
- # i.e.
7
- #
8
- # class << self; self; end;
9
- #
10
- def metaclass; class << self; self; end; end
11
-
12
- # Execute a block +&blk+ within the metaclass of the current object.
13
- def meta_eval &blk; metaclass.instance_eval &blk; end
14
-
15
- # Add an instance method called +name+ to metaclass for the current object.
16
- # This is useful because it will be available as a singleton method
17
- # to all subclasses too.
18
- def meta_def name, &blk
19
- meta_eval { define_method name, &blk }
20
- end
21
-
22
- # Add a class method called +name+ for the current object's class. This
23
- # isn't so special but it maintains consistency with meta_def.
24
- def class_def name, &blk
25
- class_eval { define_method name, &blk }
26
- end
27
-
28
-
29
- # A convenient method for getting the metaclass of the metaclass
30
- # i.e.
31
- #
32
- # self.metaclass.metaclass
33
- #
34
- def metametaclass; self.metaclass.metaclass; end
35
-
36
- def metameta_eval &blk; metametaclass.instance_eval &blk; end
37
-
38
- def metameta_def name, &blk
39
- metameta_eval { define_method name, &blk }
40
- end
41
-
42
- end
43
-
44
- # Create an instance method
45
- class NamedArray1
46
- class_eval do
47
- define_method(:name) do
48
- :roger
49
- end
50
- end
51
- end
52
- p [1, NamedArray1.new.name]
53
-
54
- # Create getter and setter instance methods
55
- class NamedArray2
56
- class_eval do
57
- define_method(:name) do
58
- instance_variable_get("@name")
59
- end
60
- define_method(:name=) do |val|
61
- instance_variable_set("@name", val)
62
- end
63
- end
64
- end
65
- a = NamedArray2.new
66
- a.name = :roger
67
- p [2, a.name, a.instance_variables]
68
-
69
- # Create getter and setter instance methods,
70
- # store instance variable in metaclass
71
- class NamedArray3
72
- class_eval do
73
- define_method(:name) do
74
- metaclass.instance_variable_get("@name")
75
- end
76
- define_method(:name=) do |val|
77
- metaclass.instance_variable_set("@name", val)
78
- end
79
- end
80
- end
81
- a = NamedArray3.new
82
- a.name = :roger
83
- p [3, a.name, a.instance_variables, a.metaclass.instance_variables]
84
-
85
- # Create a module with the which puts the functionality
86
- # in NamedArray3 into a class method.
87
- module StorageArea
88
- def store *junk
89
- junk.each do |name|
90
- class_eval do
91
- define_method(name) do
92
- metaclass.instance_variable_get("@#{name}")
93
- end
94
- define_method("#{name}=") do |val|
95
- metaclass.instance_variable_set("@#{name}", val)
96
- end
97
- end
98
- end
99
- end
100
- end
101
- class NamedArray4
102
- extend StorageArea
103
- store :name
104
- end
105
- a = NamedArray4.new
106
- a.name = :roger
107
- p [4, a.name, a.instance_variables, a.metaclass.instance_variables]
108
-
109
-
110
-
111
-
112
-
data/try/X2_extending.rb DELETED
@@ -1,27 +0,0 @@
1
- $:.unshift './lib'
2
- require 'attic'
3
-
4
- class A
5
- extend Attic
6
- attic :andy
7
- end
8
-
9
- class B < A
10
- attic :size
11
- end
12
-
13
- class C
14
- extend Attic
15
- attic :third
16
- end
17
-
18
- a, b, c = A.new, B.new, C.new
19
-
20
- a.andy, b.andy = 1, 2
21
-
22
- p [a.respond_to?(:andy), b.respond_to?(:andy)] # true, true
23
- p [a.andy, b.andy] # 1, 2
24
-
25
- p [a.class.attic_vars, b.class.attic_vars, c.class.attic_vars]
26
-
27
-