defmatch 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 31f145fc6e1eb79e17023f0857c7aa0743d21635
4
- data.tar.gz: ee52c39e0f841cc70ef1724453b524084463b88a
3
+ metadata.gz: 4d48a7b93d105306536da143e7762fe0184b5dbd
4
+ data.tar.gz: 982228cc5e465124ea6f6a6745ee729789c214ff
5
5
  SHA512:
6
- metadata.gz: 28cb8b2f285d1befe9ec3e5fea7be53e5c55244499f497a976463ce2662fd79dc42eb610e7e95026ed3af2318428d4cbd282af4736817053c37f3a74f39ad2ee
7
- data.tar.gz: f33a33c7ac4dd4bbe779d3c056bf0e2c39ebc7f2925f978cefa39b2a259be92e092427ea8c0c09d658398055968cf128ffa334fae16d77390fd318107bd4d142
6
+ metadata.gz: d2e95091e117a324eee5d93437d5a4a7697779c46168da203a70b4a9f5c9cce9a4f61abc3785735d339998dbd0889eb2e631e6d665b82dcf7f813e28ac4d2a21
7
+ data.tar.gz: 33f29be2d23840e56ba94f1eb14c693ec277c08a228195621af71ce68e7bb7f7ee4ee2d94d34191ec0ee16e675280cb43b8641cbeb653b884fc2f6425afb445c
data/README.md CHANGED
@@ -61,6 +61,8 @@ class TestMe
61
61
  defmatch(:magic,Fixnum,Fixnum) {|a,b| "Found two numbers #{a}:#{b}" }
62
62
  # Run this function when there is a single argument that is equal to "banana" (not a great example as this could be done with a literal)
63
63
  defmatch(:magic,lambda {|arg| arg == "banana" }) {|arg| "I matched using a procedure that made sure \"banana\" == #{arg}" }
64
+ # Run this function with no arguments
65
+ defmatch(:magic) { "nifty" }
64
66
  end
65
67
 
66
68
  #Now you have an instance method called magic that dispatches what runs based on the patterns you defined and their associated block
@@ -70,6 +72,8 @@ x.magic([1,2,3]) # -> Matches the second
70
72
  x.magic(:literally) # -> You get the idea
71
73
  x.magic(2,3)
72
74
  x.magic("banana")
75
+ x.magic()
76
+ x.magic("I","never","defined","this","to","match") # -> ArgumentError: No function clause matching arguments
73
77
  ```
74
78
 
75
79
  This can come in very handy, but remember that the order in which you define things matters. Lets say I define my magic function like this:
@@ -83,7 +87,26 @@ This can come in very handy, but remember that the order in which you define thi
83
87
 
84
88
  Even if I run ```x.magic(1)``` I will get ```2``` as the result. The second defmatch will never be matched because there is a more general match case above it. Order matters. Define your most specific matches first.
85
89
 
90
+ If you want to create class methods (yes there are no true class methods in ruby, but it's a convient definition) you can use the ```defclassmatch``` method. It works just like ```defmatch``` but makes a class method instead.
91
+
92
+ ## A note about inheritance
93
+ If you've defined a class you intend to inherit from and it uses Defmatch then be warned. Presently Defmatch defines an ```inherited``` method for your class when you extend it. So if you
94
+ use this method yourself then you'll be overwriting Defmatch's and you'll get odd errors when trying to use the defmatch/defclassmatch defined methods in your subclass. The work around for this is to reference the Defmatch version of the inherited function in your own inherited function.
95
+
96
+ ```ruby
97
+ class MySuperClass
98
+
99
+ def self.inherited(subklass)
100
+ Defmatch.inherited(self,subklass)
101
+ end
102
+
103
+ end
104
+ ```
105
+
106
+ It's not a great solution, but it will work until I come up with a better one.
107
+
86
108
  ## Roadmap
87
109
 
88
110
  * Add parameter deconstruction
111
+ * Cleaner way to handle inheritance
89
112
  * Add it to the Kernel so it's available without having to include things. This will require ruby 2.0 and I'm not prepared to kill backwards compatability yet.
@@ -1,3 +1,3 @@
1
1
  module Defmatch
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/defmatch.rb CHANGED
@@ -26,6 +26,19 @@ module Defmatch
26
26
  end
27
27
  end
28
28
 
29
+ def self.dispatch_clone(dispatch)
30
+ dispatch.keys.inject({}) {|nd,key| nd[key] = dispatch[key].clone; nd } if dispatch
31
+ end
32
+
33
+ def self.inherited(klass,subklass)
34
+ subklass.instance_variable_set(:@defmatch_dispatch_info,Defmatch.dispatch_clone(klass.instance_variable_get(:@defmatch_dispatch_info)))
35
+ subklass.instance_variable_set(:@defclassmatch_dispatch_info,Defmatch.dispatch_clone(klass.instance_variable_get(:@defclassmatch_dispatch_info)))
36
+ end
37
+
38
+ def inherited(subklass)
39
+ Defmatch.inherited(self,subklass)
40
+ end
41
+
29
42
  def defmatch(method,*args,&block)
30
43
  @defmatch_dispatch_info ||= {} # setup the methods in an instance variable
31
44
  @defmatch_dispatch_info[method] ||= [] # setup the ordered array for the method the first time
@@ -18,6 +18,38 @@ describe Defmatch do
18
18
  defclassmatch(:cscope) { self }
19
19
  end
20
20
 
21
+ class ATester < Tester
22
+ defmatch(:times,:not_in_super) { "not in super" }
23
+ end
24
+
25
+ class InheritedTesterBroken
26
+ extend(Defmatch)
27
+
28
+ defmatch(:times,Fixnum) {|num| num * 2 }
29
+
30
+ def inherited(subclass)
31
+ :do_nothing
32
+ end
33
+
34
+ end
35
+
36
+ class InheritedTesterWorkaround
37
+ extend(Defmatch)
38
+
39
+ defclassmatch(:times,Fixnum) {|num| num * 2 }
40
+
41
+ def inherited(subclass)
42
+ Defmatch.inherited(self,subclass)
43
+ end
44
+
45
+ end
46
+
47
+ class InheritedTesterBrokenA < InheritedTesterBroken
48
+ end
49
+
50
+ class InheritedTesterWorkaroundA < InheritedTesterWorkaround
51
+ end
52
+
21
53
  it 'should create methods' do
22
54
  expect(Tester).to respond_to(:defmatch)
23
55
  expect(Tester).to respond_to(:defclassmatch)
@@ -39,6 +71,20 @@ describe Defmatch do
39
71
  expect(Tester.cscope).to equal(Tester)
40
72
  end
41
73
 
74
+ it 'should allow for inheritance' do
75
+ expect(ATester.cscope).to equal(ATester)
76
+ x = Tester.new
77
+ y = ATester.new
78
+ expect(y.scope).to equal(y)
79
+ expect(y.times(:not_in_super)).to eq("not in super")
80
+ expect { x.times(:not_in_super) }.to raise_error(ArgumentError)
81
+ end
82
+
83
+ it 'should allow for inherited workaround' do
84
+ expect(InheritedTesterWorkaroundA.times(2)).to eq(4)
85
+ expect { InheritedTesterBrokenA.times(2) }.to raise_error(NoMethodError)
86
+ end
87
+
42
88
  instance = Tester.new
43
89
 
44
90
  describe instance do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: defmatch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Warnock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-15 00:00:00.000000000 Z
11
+ date: 2014-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler