internal 0.1.0alpha01 → 0.1.0.alpha2
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 +7 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +7 -1
- data/design_rationale.md +5 -9
- data/lib/internal.rb +1 -82
- data/lib/internal/version.rb +22 -26
- data/lib/module.rb +43 -0
- data/test/module_test.rb +52 -0
- metadata +27 -58
- data/.gitignore +0 -17
- data/.rvmrc +0 -1
- data/Rakefile +0 -1
- data/internal.gemspec +0 -26
- data/test/internal_test.rb +0 -67
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8beaebb6456b1b31120cf25433dd056d938c0412
|
4
|
+
data.tar.gz: a589fef9999659ba706c8e827073afb72e0e32bd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2b8b04f8deeabe6566294d22d431070e8367a23bb89c649eb893ff00ed53536a90f7c6180ce039ccabb685d8c755ea192b80f3a8470d5fb8827caa9bba236537
|
7
|
+
data.tar.gz: 4938ea8d8fe0f5cc0fac99eb4eec1a0f0ff6a73ce7ca6a388cc525327530aa1798e7fa5756d2c35687f9f441693c753c53f3c941193f8b1333226d0094c70c45
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
### v0.1.0alpha2 / 2014-07-01
|
4
|
+
|
5
|
+
* 1 major change
|
6
|
+
|
7
|
+
* Deprecated internal module mixin in favor of module class extension
|
8
|
+
|
9
|
+
### v0.1.0alpha01 / 2014-06-30
|
10
|
+
|
11
|
+
* 2 major changes
|
12
|
+
|
13
|
+
* Module Internal mixin to add internal methods for singleton classes and objects.
|
14
|
+
* Created internal method for singleton classes
|
15
|
+
* Create internal method for class instance objects
|
16
|
+
|
data/Gemfile
CHANGED
data/design_rationale.md
CHANGED
@@ -1,9 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
2. Use protected to define the internal interface
|
7
|
-
3. Use binding_of_caller gem to udpate the methods visibility
|
8
|
-
|
9
|
-
## NOTE: Abandoned since we couldn't get a solution for class methods
|
1
|
+
* Extend Module class with new internal method
|
2
|
+
* Use binding_of_caller to infer if it is internal or not
|
3
|
+
* Create aditional methods:
|
4
|
+
* internal_instance_methods
|
5
|
+
* internal_methods
|
data/lib/internal.rb
CHANGED
@@ -1,86 +1,5 @@
|
|
1
1
|
require 'internal/version'
|
2
|
-
require '
|
2
|
+
require 'module'
|
3
3
|
|
4
4
|
module Internal
|
5
|
-
def caller_internal?
|
6
|
-
caller_namespace_root == class_namespace_root
|
7
|
-
end
|
8
|
-
private :caller_internal?
|
9
|
-
|
10
|
-
def caller_namespace_root
|
11
|
-
namespace_root binding.of_caller(3).eval('self.class.name')
|
12
|
-
end
|
13
|
-
private :caller_namespace_root
|
14
|
-
|
15
|
-
def class_namespace_root
|
16
|
-
namespace_root self.name
|
17
|
-
end
|
18
|
-
private :class_namespace_root
|
19
|
-
|
20
|
-
def internal_methods
|
21
|
-
@internal_methods ||= protected_methods
|
22
|
-
end
|
23
|
-
private :internal_methods
|
24
|
-
|
25
|
-
def internal_instance_methods
|
26
|
-
@internal_instance_methods ||= protected_instance_methods
|
27
|
-
end
|
28
|
-
private :internal_instance_methods
|
29
|
-
|
30
|
-
def namespace_root(namespace)
|
31
|
-
namespace.sub!(/\A([A-Z][a-z_]*)((::.*))*\z/, '\\1')
|
32
|
-
end
|
33
|
-
private :namespace_root
|
34
|
-
|
35
|
-
def new *args
|
36
|
-
caller_internal? ? set_internal_instance_methods_public! : set_internal_instance_methods_protected!
|
37
|
-
super *args
|
38
|
-
end
|
39
|
-
public :new
|
40
|
-
|
41
|
-
def set_internal_class_methods_protected!
|
42
|
-
internal_methods.each { |m| self.instance_eval("class << self; protected :#{m}; end") }
|
43
|
-
end
|
44
|
-
private :set_internal_class_methods_protected!
|
45
|
-
|
46
|
-
def set_internal_class_methods_public!
|
47
|
-
internal_methods.each { |m| self.instance_eval("class << self; public :#{m}; end") }
|
48
|
-
end
|
49
|
-
private :set_internal_class_methods_public!
|
50
|
-
|
51
|
-
def set_internal_instance_methods_protected!
|
52
|
-
internal_instance_methods.each { |m| protected m }
|
53
|
-
end
|
54
|
-
private :set_internal_instance_methods_protected!
|
55
|
-
|
56
|
-
def set_internal_instance_methods_public!
|
57
|
-
internal_instance_methods.each { |m| public m }
|
58
|
-
end
|
59
|
-
private :set_internal_instance_methods_public!
|
60
|
-
|
61
|
-
alias_method :old_public_method_defined?, :public_method_defined?
|
62
|
-
def public_method_defined?(*args)
|
63
|
-
old_public_method_defined?(*args)
|
64
|
-
end
|
65
|
-
public :public_method_defined?
|
66
|
-
|
67
|
-
alias_method :old_public_methods, :public_methods
|
68
|
-
def public_methods
|
69
|
-
ret = old_public_methods
|
70
|
-
ret << internal_methods if caller_internal?
|
71
|
-
end
|
72
|
-
public :public_methods
|
73
|
-
|
74
|
-
alias_method :old_protected_methods, :protected_methods
|
75
|
-
def protected_methods
|
76
|
-
caller_internal? ? [] : internal_methods
|
77
|
-
end
|
78
|
-
protected :protected_methods
|
79
|
-
|
80
|
-
def work_internal_class_methods!
|
81
|
-
internal_methods.each do |m|
|
82
|
-
self.instance_eval("alias_method old_#{m} #{m}; def #{m}(*args); raise NoMethodError if !caller_internal?; old_#{m}(*args); end")
|
83
|
-
end
|
84
|
-
end
|
85
|
-
private :work_internal_class_methods!
|
86
5
|
end
|
data/lib/internal/version.rb
CHANGED
@@ -1,37 +1,33 @@
|
|
1
1
|
module Internal
|
2
2
|
def self.version
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
# Any third party software should rely only on current major version
|
4
|
+
# Any release under the current major release should be good.
|
5
|
+
# Use: gem 'internal', '~> 1.0'
|
6
|
+
#
|
7
|
+
# Any extension to the current gem should rely only on current major and minor release.
|
8
|
+
# A Change to the major or minor release can brake the extension
|
9
|
+
# Usage: gem 'internal', '~> 1.1.0'
|
10
|
+
major = 0 # Broken backwards compatibility of public interface
|
11
|
+
# Production code based on previous releases maybe be broken by this release
|
12
|
+
minor = 1 # Changed public interface. No backwards compatibility issues.
|
6
13
|
# Production code based on previous releases should not present any issues after upgrade.
|
7
14
|
# Production code based on this release may be broken when using previous releases.
|
8
|
-
|
15
|
+
# Changes to internal interface with broken backwards compatibility
|
16
|
+
# Library extensions may be broken
|
17
|
+
tiny = 0 # Changed internal interface with backward compatibility
|
9
18
|
# There should be no impact on third party software
|
10
|
-
# Library extensions using library internal interface
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
beta = nil # release candidate for first critical release (v0.9.0, v1.0.0.0beta1, v1.0.0)
|
16
|
-
pre_release = nil # release candidate of new minor releases
|
17
|
-
release_candidate = nil # Used before releasing new major or critical releases
|
19
|
+
# Library extensions using library internal interface are not broken.
|
20
|
+
# Changed private interface (protected and/or private methods). Bug fixes. Refactoring.
|
21
|
+
# No side effects of any sort should be detected
|
22
|
+
alpha = 2 # First phase of development of new major, minor or patch release
|
23
|
+
release_candidate = nil # Used before releasing new minor or major releases
|
18
24
|
|
19
|
-
|
20
|
-
|
21
|
-
if patch
|
22
|
-
version += ".#{'%03d' % patch}"
|
23
|
-
elsif pre_release
|
24
|
-
version += "pre#{'%02d' % pre_release}"
|
25
|
+
"#{major}.#{minor}.#{tiny}" << if alpha
|
26
|
+
".alpha#{alpha}"
|
25
27
|
elsif release_candidate
|
26
|
-
|
27
|
-
elsif alpha
|
28
|
-
version += "alpha#{'%02d' % alpha}"
|
29
|
-
elsif beta
|
30
|
-
version += "beta#{beta}"
|
28
|
+
".rc#{release_candidate}"
|
31
29
|
end
|
32
|
-
version
|
33
30
|
end
|
34
31
|
|
35
|
-
|
36
|
-
VERSION = version
|
32
|
+
VERSION = version.freeze
|
37
33
|
end
|
data/lib/module.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
class Module
|
2
|
+
def internal_instance_methods
|
3
|
+
@@internal_instance_methods ||= []
|
4
|
+
end
|
5
|
+
|
6
|
+
def internal_methods
|
7
|
+
@@internal_methods ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def internal(meth)
|
11
|
+
if caller[0] =~ /\A.*`singletonclass'\z/
|
12
|
+
caller_stack = 1
|
13
|
+
eval_string = 'self.name'
|
14
|
+
internal_instance_methods << meth
|
15
|
+
else
|
16
|
+
caller_stack = 1
|
17
|
+
eval_string = 'self.class.name'
|
18
|
+
internal_methods << meth
|
19
|
+
end
|
20
|
+
|
21
|
+
# alias to create instance method alias
|
22
|
+
#self.instance_eval("alias_method :__rbint_#{meth}, :#{meth}")
|
23
|
+
# same thing as
|
24
|
+
alias_method :"__rbint_#{meth}", meth
|
25
|
+
|
26
|
+
# create class method
|
27
|
+
self.class_eval( "def #{meth}
|
28
|
+
require 'binding_of_caller'
|
29
|
+
cn = binding.of_caller(#{caller_stack}).eval('#{eval_string}')
|
30
|
+
a = self.class.namespace_root(cn)
|
31
|
+
b = self.class.namespace_root(#{eval_string})
|
32
|
+
if a != b
|
33
|
+
raise NoMethodError
|
34
|
+
end
|
35
|
+
send('__rbint_#{meth}')
|
36
|
+
end")
|
37
|
+
end
|
38
|
+
|
39
|
+
def namespace_root(namespace)
|
40
|
+
namespace.sub!(/\A(([A-Z]{1}[a-z_]*)+)((::.*))*\z/, '\\1')
|
41
|
+
end
|
42
|
+
public :namespace_root
|
43
|
+
end
|
data/test/module_test.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
|
3
|
+
require 'module'
|
4
|
+
require 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'pry'
|
7
|
+
|
8
|
+
module Foo
|
9
|
+
class Foo::Bar
|
10
|
+
def bar
|
11
|
+
'bar'
|
12
|
+
end
|
13
|
+
internal :bar
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def baz
|
17
|
+
'baz'
|
18
|
+
end
|
19
|
+
internal :baz
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Foo::Baz
|
25
|
+
def self.baz
|
26
|
+
Foo::Bar.baz
|
27
|
+
end
|
28
|
+
|
29
|
+
def bar
|
30
|
+
Foo::Bar.new.bar
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class InternalTest < Minitest::Test
|
35
|
+
def test_internal_instance_method_call
|
36
|
+
assert_equal 'bar', ::Foo::Baz.new.bar
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_internal_class_method_call
|
40
|
+
assert_equal 'baz', ::Foo::Baz.baz
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_external_instance_method_call
|
44
|
+
assert_raises(NoMethodError) { Foo::Bar.new.bar }
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_external_class_method_call
|
48
|
+
assert_raises(NoMethodError) { Foo::Bar.baz }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
metadata
CHANGED
@@ -1,141 +1,110 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: internal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease: 5
|
4
|
+
version: 0.1.0.alpha2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Daniel da Silva Ferreira (dsferreira)
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-07-13 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: sender
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
13
|
- !ruby/object:Gem::Dependency
|
31
14
|
name: binding_of_caller
|
32
15
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
16
|
requirements:
|
35
|
-
- -
|
17
|
+
- - "~>"
|
36
18
|
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
19
|
+
version: '0.7'
|
38
20
|
type: :runtime
|
39
21
|
prerelease: false
|
40
22
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
23
|
requirements:
|
43
|
-
- -
|
24
|
+
- - "~>"
|
44
25
|
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
26
|
+
version: '0.7'
|
46
27
|
- !ruby/object:Gem::Dependency
|
47
28
|
name: bundler
|
48
29
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
30
|
requirements:
|
51
|
-
- - ~>
|
31
|
+
- - "~>"
|
52
32
|
- !ruby/object:Gem::Version
|
53
33
|
version: '1.3'
|
54
34
|
type: :development
|
55
35
|
prerelease: false
|
56
36
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
37
|
requirements:
|
59
|
-
- - ~>
|
38
|
+
- - "~>"
|
60
39
|
- !ruby/object:Gem::Version
|
61
40
|
version: '1.3'
|
62
41
|
- !ruby/object:Gem::Dependency
|
63
42
|
name: rake
|
64
43
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
44
|
requirements:
|
67
|
-
- -
|
45
|
+
- - "~>"
|
68
46
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
47
|
+
version: '10.3'
|
70
48
|
type: :development
|
71
49
|
prerelease: false
|
72
50
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
51
|
requirements:
|
75
|
-
- -
|
52
|
+
- - "~>"
|
76
53
|
- !ruby/object:Gem::Version
|
77
|
-
version: '
|
54
|
+
version: '10.3'
|
78
55
|
- !ruby/object:Gem::Dependency
|
79
56
|
name: minitest
|
80
57
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
58
|
requirements:
|
83
|
-
- -
|
59
|
+
- - "~>"
|
84
60
|
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
61
|
+
version: '5.0'
|
86
62
|
type: :development
|
87
63
|
prerelease: false
|
88
64
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
65
|
requirements:
|
91
|
-
- -
|
66
|
+
- - "~>"
|
92
67
|
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
68
|
+
version: '5.0'
|
94
69
|
description: Internal
|
95
70
|
email:
|
96
|
-
-
|
71
|
+
- daniel.ferreira@dsferreira.com
|
97
72
|
executables: []
|
98
73
|
extensions: []
|
99
74
|
extra_rdoc_files: []
|
100
75
|
files:
|
101
|
-
- .
|
102
|
-
- .rvmrc
|
76
|
+
- CHANGELOG.md
|
103
77
|
- Gemfile
|
104
78
|
- LICENSE.txt
|
105
79
|
- README.md
|
106
|
-
- Rakefile
|
107
80
|
- design_rationale.md
|
108
|
-
- internal.gemspec
|
109
81
|
- lib/internal.rb
|
110
82
|
- lib/internal/version.rb
|
111
|
-
-
|
112
|
-
|
83
|
+
- lib/module.rb
|
84
|
+
- test/module_test.rb
|
85
|
+
homepage: http://github.com/dsferreira/internal
|
113
86
|
licenses:
|
114
87
|
- MIT
|
88
|
+
metadata: {}
|
115
89
|
post_install_message:
|
116
90
|
rdoc_options: []
|
117
91
|
require_paths:
|
118
92
|
- lib
|
119
93
|
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
-
none: false
|
121
94
|
requirements:
|
122
|
-
- -
|
95
|
+
- - ">="
|
123
96
|
- !ruby/object:Gem::Version
|
124
97
|
version: '0'
|
125
|
-
segments:
|
126
|
-
- 0
|
127
|
-
hash: 4162978592114588374
|
128
98
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
99
|
requirements:
|
131
|
-
- -
|
100
|
+
- - ">"
|
132
101
|
- !ruby/object:Gem::Version
|
133
102
|
version: 1.3.1
|
134
103
|
requirements: []
|
135
104
|
rubyforge_project:
|
136
|
-
rubygems_version:
|
105
|
+
rubygems_version: 2.2.2
|
137
106
|
signing_key:
|
138
|
-
specification_version:
|
107
|
+
specification_version: 4
|
139
108
|
summary: Makes a class, module or method internal
|
140
109
|
test_files:
|
141
|
-
- test/
|
110
|
+
- test/module_test.rb
|
data/.gitignore
DELETED
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm --create use "ruby-1.9.3-p392@internal"
|
data/Rakefile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
data/internal.gemspec
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'internal/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = 'internal'
|
8
|
-
spec.version = Internal::VERSION
|
9
|
-
spec.authors = ['Daniel da Silva Ferreira (dsferreira)']
|
10
|
-
spec.email = ['danieldasilvaferreira@gmail.com']
|
11
|
-
spec.description = %q{Internal}
|
12
|
-
spec.summary = %q{Makes a class, module or method internal}
|
13
|
-
spec.homepage = ''
|
14
|
-
spec.license = 'MIT'
|
15
|
-
|
16
|
-
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = ['lib']
|
20
|
-
|
21
|
-
spec.add_dependency 'sender'
|
22
|
-
spec.add_dependency 'binding_of_caller'
|
23
|
-
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
|
-
spec.add_development_dependency 'rake'
|
25
|
-
spec.add_development_dependency 'minitest'
|
26
|
-
end
|
data/test/internal_test.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
$:.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
-
|
3
|
-
require 'pry'
|
4
|
-
require 'minitest'
|
5
|
-
require 'minitest/autorun'
|
6
|
-
require 'internal'
|
7
|
-
|
8
|
-
module Foo
|
9
|
-
end
|
10
|
-
|
11
|
-
class Foo::Bar
|
12
|
-
extend Internal
|
13
|
-
|
14
|
-
def initialize(*args)
|
15
|
-
@args = args
|
16
|
-
end
|
17
|
-
|
18
|
-
def bar
|
19
|
-
@args
|
20
|
-
end
|
21
|
-
protected :bar
|
22
|
-
|
23
|
-
class << self
|
24
|
-
def baz
|
25
|
-
'baz'
|
26
|
-
end
|
27
|
-
public :baz
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class Foo::Baz
|
32
|
-
def self.baz
|
33
|
-
Foo::Bar.baz
|
34
|
-
end
|
35
|
-
|
36
|
-
def bar(*args)
|
37
|
-
Foo::Bar.new(*args).bar
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class Bar
|
42
|
-
def self.baz
|
43
|
-
Foo::Bar.baz
|
44
|
-
end
|
45
|
-
|
46
|
-
def bar(*args)
|
47
|
-
Foo::Bar.new(*args).bar
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class InternalTest < Minitest::Test
|
52
|
-
def test_internal_class_instance_method
|
53
|
-
assert_equal ::Foo::Baz.new.bar('a'), ['a']
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_internal_class_singleton_method
|
57
|
-
assert_equal ::Foo::Baz.baz, 'baz'
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_external_class_instance_method
|
61
|
-
assert_raises(NoMethodError) { ::Bar.new.bar('a') }
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_external_class_singleton_method
|
65
|
-
assert_raises(NoMethodError) { ::Bar.baz }
|
66
|
-
end
|
67
|
-
end
|