dry-behaviour 0.4.0 → 0.4.1

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: 597908ea5e4f168109a48128ea4992cd86652edc
4
- data.tar.gz: 3945b08a31f1f62784dd9873d1f7a6ded0f94072
3
+ metadata.gz: 10b6f0cc420cd9468416de830efd6ad70c97aed3
4
+ data.tar.gz: 42d5361f783f46ca02fae67040fb0369f340396a
5
5
  SHA512:
6
- metadata.gz: 7f205f7f1427902ab7b55713496b4da292c0a31f887db84127ae672347fa0fc23ff9fb113e80b029b366e84bc71adcdf33011ce2cca82bc1118ef4a4da2d88de
7
- data.tar.gz: 820ff1120fd32773cd93a2e1efe879b56205a6e0104b0c53df5a72743d362203fa6367f3000400effc6f81748603bb17634286ec7e92829458ef462469a35d2c
6
+ metadata.gz: d2d655c6c97dd126277d1a37e6eaacb422cd53625cc097a52504a7e03e96882d6861c8812dad3d8959bfbf634f68bb4b9994e2d76f1ca53b4eb6f40e4f8e112a
7
+ data.tar.gz: 2c66cb9a3899a2de3da5e8b8b685701e5e2e7e564902045a9b1323ebe90e5c737919b285ee74991c9287e572e6bf1ddd065ae5c71d0f90dde8b7f5a6a1475f31
data/README.md CHANGED
@@ -64,6 +64,10 @@ expect(Protocols::Adder.add_default(1)).to eq(6)
64
64
 
65
65
  ## Changelog
66
66
 
67
+ ### `0.4.1` :: Protocol-wide methods are allowed to call from implementation
68
+
69
+ **NB** Works for all `defimpl`s.
70
+
67
71
  ### `0.4.0` :: Protocol-wide methods are allowed to call from inside implementation
68
72
 
69
73
  ```ruby
@@ -68,20 +68,27 @@ module Dry
68
68
  end
69
69
  end
70
70
 
71
+ POSTPONE_EXTEND = lambda do |target, protocol|
72
+ TracePoint.new(:end) do |tp|
73
+ if tp.self == protocol
74
+ puts "#{tp.self.inspect} | #{protocol.name}"
75
+ target.extend protocol
76
+ tp.disable
77
+ end
78
+ end.enable
79
+ end
80
+
81
+
71
82
  def defimpl(protocol = nil, target: nil, delegate: [], map: {})
72
83
  raise if target.nil? || !block_given? && delegate.empty? && map.empty?
73
84
 
74
85
  mds = normalize_map_delegates(delegate, map)
86
+
75
87
  Module.new do
76
88
  mds.each(&DELEGATE_METHOD.curry[singleton_class])
77
89
  singleton_class.class_eval(&Proc.new) if block_given? # block takes precedence
78
- if protocol
79
- extend protocol
80
- else # FIXME:
81
- BlackTie.Logger.warn('Cross-calling protocol methods is not yet implemented for inplace declarated implementations.')
82
- end
83
90
  end.tap do |mod|
84
- protocol ||= self
91
+ protocol ? mod.extend(protocol) : POSTPONE_EXTEND.(mod, protocol = self)
85
92
 
86
93
  mod.methods(false).tap do |meths|
87
94
  (BlackTie.protocols[protocol].keys - meths).each_with_object(meths) do |m, acc|
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Behaviour
3
- VERSION = '0.4.0'.freeze
3
+ VERSION = '0.4.1'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-behaviour
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksei Matiushkin
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-13 00:00:00.000000000 Z
13
+ date: 2017-01-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler