overloaded_methods 3.2.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 671cad9d817d844cf7c28ece267263b222f3f631
4
+ data.tar.gz: 0287d2812363eeedcf6beffc4168ed244e9df11d
5
+ SHA512:
6
+ metadata.gz: 130b0edff2ffe7cba60cbd2509c7ade7be273ed6a453ade0f1bbc363e11037baa30767456fd45cf49cb80e9f5f7b55d5637b6001e5480c4a958fcb56d746891f
7
+ data.tar.gz: 255506194bc28e2b822b0dae67daef641e16ec5c7cb5e725383f90c9369d28838b46ee52a28a03d1dfe7c2c5d93b382af6280cf36e3a06c0ead15c5d97a4f00c
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ script: rspec
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.2
7
+ - 2.2.0
8
+ - ruby-head
9
+ - rbx-2
10
+ - jruby-head
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/License.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Corey Haines
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # Overloaded Methods
2
+
3
+ [![Build Status](https://travis-ci.org/coreyhaines/overloaded_methods.svg?branch=master)](https://travis-ci.org/coreyhaines/overloaded_methods)
4
+
5
+ [http://github.com/coreyhaines/overloaded_methods](http://github.com/coreyhaines/overloaded_methods)
6
+
7
+ ## DESCRIPTION:
8
+
9
+ overloaded_methods was inspired by erlang pattern matching. Basically, the idea is that you can specify a method and several code blocks based on aspects of the parameters. Here's an example:
10
+
11
+ ```
12
+ overload_method :even_odd do |m|
13
+ m.when {|number| number % 2 == 0 }.do { :even }
14
+ m.when {|number| number % 2 == 1 }.do { :odd }
15
+ end
16
+ ```
17
+
18
+ You can then call even_odd(2) and get :even, even_odd(3) gives you :odd.
19
+
20
+ the specs have more examples.
21
+
22
+ Special thanks to Jim Weirich for suggesting some great improvements in the syntax.
23
+
24
+ There is an alternate syntax with pattern/does
25
+ ```
26
+ overload_method :even_odd do |m|
27
+ m.pattern {|number| number % 2 == 0 }.does { :even }
28
+ m.pattern {|number| number % 2 == 1 }.does { :odd }
29
+ end
30
+ ```
31
+ However, this syntax may or may not be deprecated in favor of the when/do syntax.
32
+
33
+ Here's an example of Fibonacci calculation:
34
+ ```
35
+ class CalculatesFibonacci
36
+
37
+ class << self
38
+ include OverloadedMethods
39
+ overload_method :entry do |m|
40
+ m.when{|which| which <= 1}.do{|which| which}
41
+ m.default{|which|
42
+ CalculatesFibonacci.entry(which-1) + CalculatesFibonacci.entry(which-2)
43
+ }
44
+ end
45
+ end
46
+ end
47
+ ```
48
+
49
+
50
+ ## SYNOPSIS:
51
+
52
+ The following is from the specs, just some examples of how to use it.
53
+
54
+ ```
55
+ class WithWhenDo
56
+ include OverloadedMethods
57
+
58
+ overload_method :even_odd do |m|
59
+ m.when {|number| number % 2 == 0 }.do { :even }
60
+ m.when {|number| number % 2 == 1 }.do { :odd }
61
+ end
62
+
63
+ overload_method :hello_world do |m|
64
+ m.when { true }.do {'hello, world'}
65
+ end
66
+
67
+ overload_method :return_params do |m|
68
+ m.when { |param1, param2| true}.do {|param1, param2| [param1, param2]}
69
+ end
70
+
71
+ overload_method :two_params_collected do |m|
72
+ m.default { |param1, *params| [param1, params] }
73
+ end
74
+
75
+ overload_method :number_of_digits do |m|
76
+ m.when {|number| number < 10}.do {1}
77
+ m.when {|number| number< 100}.do {2}
78
+ m.default { 'more than two digits is crazy talk'}
79
+ end
80
+
81
+ overload_method :default_returns_parameters do |m|
82
+ m.default { |*params| params}
83
+ end
84
+
85
+ end
86
+ ```
87
+
88
+ ## REQUIREMENTS:
89
+
90
+ Ruby
91
+
92
+ ## INSTALL:
93
+
94
+ ```gem install overloaded_methods```
95
+
96
+ or, if using Bundler,
97
+
98
+ ```gem 'overloaded_methods'```
99
+
100
+ ## LICENSE:
101
+
102
+ See [License.txt](License.txt)
@@ -0,0 +1,3 @@
1
+ module OverloadedMethods
2
+ VERSION = "3.2.7"
3
+ end
@@ -0,0 +1,58 @@
1
+ require "overloaded_methods/version"
2
+
3
+ module OverloadedMethods
4
+
5
+ def overload_method name
6
+ collector = FunctionDefinition.new
7
+ yield collector
8
+ define_method name do |*params|
9
+ collector.execute params
10
+ end
11
+ end
12
+
13
+ class Clause
14
+ def self.match_all
15
+ new ->*{true}
16
+ end
17
+ def self.with_predicate(predicate)
18
+ new predicate
19
+ end
20
+ attr_reader :predicate
21
+ def initialize(predicate)
22
+ @predicate = predicate
23
+ end
24
+ def match?(*params)
25
+ @predicate.call(*params)
26
+ end
27
+ def do &block
28
+ @block = block
29
+ self
30
+ end
31
+ def return value
32
+ self.do {|*|value}
33
+ end
34
+ alias :does :do
35
+ def call *params
36
+ @block.call *params
37
+ end
38
+ end
39
+
40
+ class FunctionDefinition
41
+ def initialize
42
+ @clauses = []
43
+ @default = Clause.match_all.return(nil)
44
+ end
45
+ def when &predicate
46
+ Clause.with_predicate(predicate).tap { |clause| @clauses << clause }
47
+ end
48
+ alias :pattern :when
49
+ def execute params
50
+ [*@clauses, @default]
51
+ .find { |clause| clause.match? *params }
52
+ .call(*params)
53
+ end
54
+ def default &block
55
+ @default = Clause.match_all.do(&block)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,74 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "overloaded_methods/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "overloaded_methods"
7
+ s.version = OverloadedMethods::VERSION
8
+ s.authors = ["Corey Haines", "Josh Cheek"]
9
+ s.email = ["coreyhaines@gmail.com", "josh.cheek@gmail.com"]
10
+ s.homepage = "https://github.com/coreyhaines/overloaded_methods"
11
+ s.summary = %q{Bringing the power of predicate-based method dispatch to Ruby, where it belongs!}
12
+ s.description = %q{Single clause, branching method definitions are so 2007. Get with SRP and party! With overloaded_methods, you can separate out any conditional branching in your method to where it belongs: predicates! Feel the power of the chain-of-responsibility pattern in your own code!!!!!!}
13
+ s.license = "MIT"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_development_dependency "rspec", "~> 3.0"
21
+
22
+ s.post_install_message = <<'Omg, frogs <3'.gsub(/(gg+)/) { |capture| "\e[32m#{capture.gsub 'g', '.'}\e[0m" }.gsub("brown", "\e[33m").gsub("off", "\e[0m")
23
+ .7
24
+ . .M
25
+ . . .N
26
+ M. ..O
27
+ =. .. .M
28
+ N . . .N
29
+ O.. . . O
30
+ MN:. . M
31
+ OM...N
32
+ N .OM brown.NM8MMMMMMoff
33
+ O ..N brown...MM=:Z7?Z7??MMMMIMMOM8Noff
34
+ M...O brown,MMMMMMMMMM$$:=ZZ$~:$?7ZMMMMM8?Moff
35
+ .N . M brownMMI$7:==?:77MMMM7$O~+~ZO~~I=7ZMMMMoff
36
+ O$...N brownM=$ZZI=MMM7ZZI=?MMZ+:$I?8Z~?ZO~=ZIMMoff
37
+ .MN ...O brownM~?Z==ZZZ=MM$$=$ZZMMO=~~?$=$Z~~OO+=MMoff
38
+ OM ...,M DAAAAAAAAAAAAAAAAAAAAAAAMbrown=Z=+OOI=+ZO$O+MMoff
39
+ NOM.. . N DAAAAAAAAAAAAM?:DAAAAAAAAAAAAMbrown$ZZ?$+IZ7+8?M8off
40
+ NOM.....O DAAAAAAAAM:ggggDAAAAAAAAAAAAAAMbrown78OI+D=78=$MMoff
41
+ NO.. ...MN DAAAAAAAMgggggggDAAAAAAAAAAAAAM,MMbrownMO7?I8Z7OMoff
42
+ MN.... ..O DAAAAAMgggggggggDAAAAAAAAAAAAMgg~MMbrown?NMM7O8MMoff
43
+ NOM.. ..MN DAAMggggggggggggDAAAAAAAAAAMgggggggMMbrown7.MMMoff
44
+ NOM.. .. .OM MggggggggggggggggDAAAAAAAMgggggggggggMM:M
45
+ NOM. .. ..NO Mggggggggggggggggggg~DAAMggggggggggggggI,,M
46
+ NOM.. .. .MN MMgggbrownZMMMMMMoffggggggggggggggggggggggggggggg=MM
47
+ NOM. . ... O MggbrownMMMNMMMMMMMMZoffgggggggggggggggggggggggggg$MI
48
+ NOM8.. .. .MM MZbrownMMMMMMMMMMMMMMMoffgggggggggM~gggggggggggggggMM
49
+ NOM .. . . NOM Mgggggggggggggggggggggggg8M$ggggggggggggggggMM
50
+ NOMO. . . . . M.MMMMMMMMMMMMNMMMMNMMMMMMggggggggggggggggggMM,
51
+ NOMM8. . M:MM MMggggggggggggggggggggggggggggggggggggggMM
52
+ . .MMMM brownMMMMgggggggggggggbrown7ZMMggggggggggggggggggMM
53
+ .MNOM brownMMMMMMMMMMMMMMMMMMMggggggggggggggggggggOMM
54
+ H brownMMMMMMMMMMMMMMMMMggggggg,ggggggggggggggMM
55
+ brownMMMMMMMMMMMM=gggggggggMMggggggggggggggMMN
56
+ brown:MMMMggggggggggggggggMgggggggMggggggMMM
57
+ MMMggggggggggggggMNggggg:7gggggggMMM .MMMMMM
58
+ MMMMgggggggggMgggMgggggMgggggggggMMMMggggggMM
59
+ MggMMMgggggggMgggMgggg=IggggggggMMgggggggggM
60
+ MggMMMMgggggMggggMggggMgggggMMM:ggggggggggMM
61
+ MMggM MMMgggMgggMMgggMggggMMMgggggggggggggM,
62
+ .MggMM MMMMMMgggMggggMgggggggggggggggggggMM
63
+ ggMMMMMMMMggM MggMMMgggMMgggOMggggggggggggggMNggMM
64
+ MgggggggggggggM MMMggMMgggMMMMMMMgggggggggggggMgg+MM
65
+ :MM7ggggMggIMM D ggM?MgggMM MgggggggggggMMggMM,
66
+ .MggMgg ggg gM+gggM NMggggggggMMMggMM
67
+ .MM+gZMMgggggM MMMMMMMMMMggggM
68
+ MIgg8MM,ggggMM .MMMggMggM
69
+ MMMgggMMMMggMI ggOMMMggOMMggMM
70
+ MgggMDggggM M MgggggNMMggMMggM
71
+ MMMMgggggM ggM .M:gggMggggMggggM
72
+ MM MMMMggggggMMMI
73
+ Omg, frogs <3
74
+ end
@@ -0,0 +1,171 @@
1
+ require 'overloaded_methods'
2
+
3
+ RSpec.configure do |c|
4
+ c.disable_monkey_patching!
5
+ end
6
+
7
+ class CalculatesFibonacci
8
+ class << self
9
+ extend OverloadedMethods
10
+ overload_method :entry do |m|
11
+ m.when{|which| which <= 1}.do{|which| which}
12
+ m.default{|which|
13
+ CalculatesFibonacci.entry(which-1) + CalculatesFibonacci.entry(which-2)
14
+ }
15
+ end
16
+ end
17
+ end
18
+
19
+ RSpec.describe CalculatesFibonacci do
20
+ it "should return 0 for 0" do
21
+ expect(CalculatesFibonacci.entry(0)).to eq(0)
22
+ end
23
+ it "should return 1 for 1" do
24
+ expect(CalculatesFibonacci.entry(1)).to eq(1)
25
+ end
26
+ it "should return 1 for 2" do
27
+ expect(CalculatesFibonacci.entry(2)).to eq(1)
28
+ end
29
+ {3 => 2, 4 => 3, 5 => 5, 6 => 8}.each_pair {|which,value|
30
+ it "should return #{value} for #{which}" do
31
+ expect(CalculatesFibonacci.entry(which)).to eq(value)
32
+ end
33
+ }
34
+ end
35
+
36
+
37
+ class WithWhenDo
38
+ extend OverloadedMethods
39
+
40
+ overload_method :even_odd do |m|
41
+ m.when {|number| number % 2 == 0 }.do { :even }
42
+ m.when {|number| number % 2 == 1 }.do { :odd }
43
+ end
44
+
45
+ overload_method :hello_world do |m|
46
+ m.when { true }.do {'hello, world'}
47
+ end
48
+
49
+ overload_method :return_params do |m|
50
+ m.when { |param1, param2| true}.do {|param1, param2| [param1, param2]}
51
+ end
52
+
53
+ overload_method :two_params_collected do |m|
54
+ m.default { |param1, *params| [param1, params] }
55
+ end
56
+
57
+ overload_method :number_of_digits do |m|
58
+ m.when {|number| number < 10}.do {1}
59
+ m.when {|number| number< 100}.do {2}
60
+ m.default { 'more than two digits is crazy talk'}
61
+ end
62
+
63
+ overload_method :no_default do |m|
64
+ end
65
+
66
+ overload_method :default_returns_parameters do |m|
67
+ m.default { |*params| params}
68
+ end
69
+
70
+ end
71
+
72
+ class WithPatternDoes
73
+ extend OverloadedMethods
74
+ overload_method :hello_world do |m|
75
+ m.pattern { true }.does {'hello, world'}
76
+ end
77
+
78
+ overload_method :return_params do |m|
79
+ m.pattern { |param1, param2| true}.does {|param1, param2| [param1, param2]}
80
+ end
81
+
82
+ overload_method :even_odd do |m|
83
+ m.pattern {|number| number % 2 == 0 }.does { :even }
84
+ m.pattern {|number| number % 2 == 1 }.does { :odd }
85
+ end
86
+
87
+ overload_method :number_of_digits do |m|
88
+ m.pattern {|number| number < 10}.does {1}
89
+ m.pattern {|number| number< 100}.does {2}
90
+ m.default { 'more than two digits is crazy talk'}
91
+ end
92
+
93
+ overload_method :no_default do |m|
94
+ end
95
+
96
+ overload_method :default_returns_parameters do |m|
97
+ m.default { |*params| params}
98
+ end
99
+
100
+ overload_method :two_params_collected do |m|
101
+ m.default { |param1, *params| [param1, params] }
102
+ end
103
+
104
+
105
+ end
106
+
107
+
108
+
109
+
110
+ RSpec.describe OverloadedMethods do
111
+ [WithWhenDo, WithPatternDoes].each {|klass|
112
+ describe "#{klass.to_s}" do
113
+ it "should run the first method if the first pattern passes" do
114
+ expect(klass.new.even_odd(2)).to eq(:even)
115
+ end
116
+ it "should run the second method if the first pattern fails, second pattern passes" do
117
+ expect(klass.new.even_odd(3)).to eq(:odd)
118
+ end
119
+
120
+ describe "when only a true pattern" do
121
+ it "should add the method that you define" do
122
+ expect(klass.new).to respond_to(:hello_world)
123
+ end
124
+ it "should call the block" do
125
+ expect(klass.new.hello_world).to eq('hello, world')
126
+ end
127
+ end
128
+ describe "when calling with parameters" do
129
+ it "should pass the parameters to the block" do
130
+ returns = klass.new.return_params 'corey', 'haines'
131
+ expect(returns).to include('corey')
132
+ expect(returns).to include('haines')
133
+ end
134
+ describe "when trying to collect different parts of the parameters into an array" do
135
+ it "should parse out the desired parameters and put the rest into an array" do
136
+ return1, others = klass.new.two_params_collected 1, 2, 3
137
+ expect(return1).to eq(1)
138
+ expect(others).to include(2)
139
+ expect(others).to include(3)
140
+ end
141
+ end
142
+
143
+ end
144
+ describe "when calling with a pattern" do
145
+ it "should run the first method if the first pattern passes" do
146
+ expect(klass.new.even_odd(2)).to eq(:even)
147
+ end
148
+ it "should run the second method if the first pattern fails, second pattern passes" do
149
+ expect(klass.new.even_odd(3)).to eq(:odd)
150
+ end
151
+ end
152
+
153
+ describe "when using the default" do
154
+ it "should execute the default if no predicate passes" do
155
+ expect(klass.new.number_of_digits(176)).to eq('more than two digits is crazy talk')
156
+ end
157
+ it "should not crash if there is no default given" do
158
+ expect(klass.new.no_default).to be_nil
159
+ end
160
+ it "should pass the parameters to the default method, as well" do
161
+ returns = klass.new.default_returns_parameters 'Rachel', 'Davis'
162
+ expect(returns).to include('Rachel')
163
+ expect(returns).to include('Davis')
164
+ end
165
+ end
166
+ end
167
+
168
+ }
169
+
170
+
171
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: overloaded_methods
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.2.7
5
+ platform: ruby
6
+ authors:
7
+ - Corey Haines
8
+ - Josh Cheek
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-01-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3.0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3.0'
28
+ description: 'Single clause, branching method definitions are so 2007. Get with SRP
29
+ and party! With overloaded_methods, you can separate out any conditional branching
30
+ in your method to where it belongs: predicates! Feel the power of the chain-of-responsibility
31
+ pattern in your own code!!!!!!'
32
+ email:
33
+ - coreyhaines@gmail.com
34
+ - josh.cheek@gmail.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - ".travis.yml"
40
+ - Gemfile
41
+ - License.txt
42
+ - README.md
43
+ - lib/overloaded_methods.rb
44
+ - lib/overloaded_methods/version.rb
45
+ - overloaded_methods.gemspec
46
+ - spec/overloaded_methods_spec.rb
47
+ homepage: https://github.com/coreyhaines/overloaded_methods
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message: " .7\n . .M\n . . .N\n M. ..O\n
52
+ \ =. .. .M\n N . . .N\n O.. . . O\n MN:. . M\n OM...N\n
53
+ \ N .OM \e[33m.NM8MMMMMM\e[0m\n O ..N \e[33m...MM=:Z7?Z7??MMMMIMMOM8N\e[0m\n
54
+ \ M...O \e[33m,MMMMMMMMMM$$:=ZZ$~:$?7ZMMMMM8?M\e[0m\n .N
55
+ . M \e[33mMMI$7:==?:77MMMM7$O~+~ZO~~I=7ZMMMM\e[0m\n O$...N \e[33mM=$ZZI=MMM7ZZI=?MMZ+:$I?8Z~?ZO~=ZIMM\e[0m\n
56
+ \ .MN ...O \e[33mM~?Z==ZZZ=MM$$=$ZZMMO=~~?$=$Z~~OO+=MM\e[0m\n OM
57
+ ...,M DAAAAAAAAAAAAAAAAAAAAAAAM\e[33m=Z=+OOI=+ZO$O+MM\e[0m\n NOM.. . N
58
+ \ DAAAAAAAAAAAAM?:DAAAAAAAAAAAAM\e[33m$ZZ?$+IZ7+8?M8\e[0m\n NOM.....O DAAAAAAAAM:\e[32m....\e[0mDAAAAAAAAAAAAAAM\e[33m78OI+D=78=$MM\e[0m\n
59
+ \ NO.. ...MN DAAAAAAAM\e[32m.......\e[0mDAAAAAAAAAAAAAM,MM\e[33mMO7?I8Z7OM\e[0m\n
60
+ \ MN.... ..O DAAAAAM\e[32m.........\e[0mDAAAAAAAAAAAAM\e[32m..\e[0m~MM\e[33m?NMM7O8MM\e[0m\n
61
+ \ NOM.. ..MN DAAM\e[32m............\e[0mDAAAAAAAAAAM\e[32m.......\e[0mMM\e[33m7.MMM\e[0m\n
62
+ NOM.. .. .OM M\e[32m................\e[0mDAAAAAAAM\e[32m...........\e[0mMM:M\n
63
+ NOM. .. ..NO M\e[32m...................\e[0m~DAAM\e[32m..............\e[0mI,,M\n
64
+ NOM.. .. .MN MM\e[32m...\e[0m\e[33mZMMMMMM\e[0m\e[32m.............................\e[0m=MM\n
65
+ NOM. . ... O M\e[32m..\e[0m\e[33mMMMNMMMMMMMMZ\e[0m\e[32m..........................\e[0m$MI\n
66
+ NOM8.. .. .MM MZ\e[33mMMMMMMMMMMMMMMM\e[0m\e[32m.........\e[0mM~\e[32m...............\e[0mMM\n
67
+ \ NOM .. . . NOM M\e[32m........................\e[0m8M$\e[32m................\e[0mMM\n
68
+ \ NOMO. . . . . M.MMMMMMMMMMMMNMMMMNMMMMMM\e[32m..................\e[0mMM,\n
69
+ \ NOMM8. . M:MM MM\e[32m......................................\e[0mMM\n
70
+ \ . .MMMM \e[33mMMMM\e[32m.............\e[0m\e[33m7ZMM\e[32m..................\e[0mMM\n
71
+ \ .MNOM \e[33mMMMMMMMMMMMMMMMMMMM\e[32m....................\e[0mOMM\n
72
+ \ H \e[33mMMMMMMMMMMMMMMMMM\e[32m.......\e[0m,\e[32m..............\e[0mMM\n
73
+ \ \e[33mMMMMMMMMMMMM=\e[32m.........\e[0mMM\e[32m..............\e[0mMMN\n
74
+ \ \e[33m:MMMM\e[32m................\e[0mM\e[32m.......\e[0mM\e[32m......\e[0mMMM\n
75
+ \ MMM\e[32m..............\e[0mMN\e[32m.....\e[0m:7\e[32m.......\e[0mMMM
76
+ .MMMMMM\n MMMM\e[32m.........\e[0mM\e[32m...\e[0mM\e[32m.....\e[0mM\e[32m.........\e[0mMMMM\e[32m......\e[0mMM\n
77
+ \ M\e[32m..\e[0mMMM\e[32m.......\e[0mM\e[32m...\e[0mM\e[32m....\e[0m=I\e[32m........\e[0mMM\e[32m.........\e[0mM\n
78
+ \ M\e[32m..\e[0mMMMM\e[32m.....\e[0mM\e[32m....\e[0mM\e[32m....\e[0mM\e[32m.....\e[0mMMM:\e[32m..........\e[0mMM\n
79
+ \ MM\e[32m..\e[0mM MMM\e[32m...\e[0mM\e[32m...\e[0mMM\e[32m...\e[0mM\e[32m....\e[0mMMM\e[32m.............\e[0mM,\n
80
+ \ .M\e[32m..\e[0mMM MMMMMM\e[32m...\e[0mM\e[32m....\e[0mM\e[32m...................\e[0mMM\n
81
+ \ \e[32m..\e[0mMMMMMMMM\e[32m..\e[0mM M\e[32m..\e[0mMMM\e[32m...\e[0mMM\e[32m...\e[0mOM\e[32m..............\e[0mMN\e[32m..\e[0mMM\n
82
+ \ M\e[32m.............\e[0mM MMM\e[32m..\e[0mMM\e[32m...\e[0mMMMMMMM\e[32m.............\e[0mM\e[32m..\e[0m+MM\n
83
+ \ :MM7\e[32m....\e[0mM\e[32m..\e[0mIMM D \e[32m..\e[0mM?M\e[32m...\e[0mMM
84
+ \ M\e[32m...........\e[0mMM\e[32m..\e[0mMM,\n .M\e[32m..\e[0mM\e[32m..\e[0m
85
+ \ \e[32m...\e[0m gM+\e[32m...\e[0mM NM\e[32m........\e[0mMMM\e[32m..\e[0mMM\n
86
+ \ .MM+gZMM\e[32m.....\e[0mM MMMMMMMMMM\e[32m....\e[0mM\n
87
+ \ MI\e[32m..\e[0m8MM,\e[32m....\e[0mMM .MMM\e[32m..\e[0mM\e[32m..\e[0mM\n
88
+ \ MMM\e[32m...\e[0mMMMM\e[32m..\e[0mMI \e[32m..\e[0mOMMM\e[32m..\e[0mOMM\e[32m..\e[0mMM\n
89
+ \ M\e[32m...\e[0mMD\e[32m....\e[0mM M M\e[32m.....\e[0mNMM\e[32m..\e[0mMM\e[32m..\e[0mM\n
90
+ \ MMMM\e[32m.....\e[0mM \e[32m..\e[0mM .M:\e[32m...\e[0mM\e[32m....\e[0mM\e[32m....\e[0mM\n
91
+ \ MM MMMM\e[32m......\e[0mMMMI\n"
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.2.2
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Bringing the power of predicate-based method dispatch to Ruby, where it belongs!
111
+ test_files: []