bruce-clingwrap 0.0.2
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.
- data/clingwrap.gemspec +20 -0
- data/examples/simple.rb +44 -0
- data/lib/clingwrap.rb +14 -0
- data/lib/clingwrap/basic.rb +55 -0
- metadata +56 -0
data/clingwrap.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "clingwrap"
|
3
|
+
s.version = "0.0.2"
|
4
|
+
s.date = "2009-01-05"
|
5
|
+
s.summary = "Simple method wrapping"
|
6
|
+
s.email = "bruce@codefluency.com"
|
7
|
+
s.homepage = "http://github.com/bruce/clingwrap"
|
8
|
+
s.description = "A simple library for wrapping Ruby methods using named or anonymous modules."
|
9
|
+
s.has_rdoc = true
|
10
|
+
s.authors = ["Bruce Williams"]
|
11
|
+
s.files = [
|
12
|
+
"clingwrap.gemspec",
|
13
|
+
"lib/clingwrap.rb",
|
14
|
+
"lib/clingwrap/basic.rb",
|
15
|
+
"examples/simple.rb"
|
16
|
+
]
|
17
|
+
s.test_files = []
|
18
|
+
# s.rdoc_options = ["--main", "README.textile"]
|
19
|
+
s.extra_rdoc_files = []
|
20
|
+
end
|
data/examples/simple.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) << '/../lib')
|
2
|
+
|
3
|
+
require 'clingwrap'
|
4
|
+
|
5
|
+
class Widget
|
6
|
+
def do_something
|
7
|
+
sleep 0.12
|
8
|
+
puts "Did something!"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module DoSomethingPreparation
|
13
|
+
def do_something
|
14
|
+
puts "(prepwork for Widget#do_something)"
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Widget.clingwrap(DoSomethingPreparation)
|
20
|
+
|
21
|
+
Widget.clingwrap "Time invocation" do
|
22
|
+
def do_something
|
23
|
+
start = Time.now
|
24
|
+
result = super
|
25
|
+
puts "Elapsed: %.4fs" % (Time.now - start)
|
26
|
+
result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# no-op
|
31
|
+
Widget.clingwrap do
|
32
|
+
def do_something
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
widget = Widget.new
|
39
|
+
widget.do_something
|
40
|
+
|
41
|
+
puts "\nUsing super-and-extend, not just an alias hack!"
|
42
|
+
puts "---\nIt also gives anonymous wrappers pretty names when inspected:"
|
43
|
+
p (class << widget; self; end).ancestors
|
44
|
+
|
data/lib/clingwrap.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module Cling
|
2
|
+
|
3
|
+
module Hook
|
4
|
+
|
5
|
+
def new(*args, &block)
|
6
|
+
::Cling.on(super, self)
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.on(instance, level)
|
12
|
+
if level.superclass
|
13
|
+
on(instance, level.superclass)
|
14
|
+
end
|
15
|
+
current = wrappers[level]
|
16
|
+
if current
|
17
|
+
current.each { |wrapper| instance.extend(wrapper) }
|
18
|
+
end
|
19
|
+
instance
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.label(wrapper, description, location)
|
23
|
+
short = File.basename(location)
|
24
|
+
contents = if !wrapper.name.empty?
|
25
|
+
":#{wrapper.name}@#{short}"
|
26
|
+
elsif description
|
27
|
+
":#{description.inspect}@#{short}"
|
28
|
+
else
|
29
|
+
"@#{short}"
|
30
|
+
end
|
31
|
+
label = "(Clingwrap#{contents})"
|
32
|
+
(class << wrapper; self; end).class_eval "def inspect; #{label.inspect}; end"
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.wrap(target, *args, &block)
|
36
|
+
_wrap(target, caller[0], *args, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self._wrap(target, location, *args, &block)
|
40
|
+
description = args.last.is_a?(String) ? args.pop : nil
|
41
|
+
wrapper = args.shift || Module.new(&block)
|
42
|
+
label(wrapper, description, location)
|
43
|
+
(wrappers[target] ||= []) << wrapper
|
44
|
+
target.extend Hook
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.wrappers
|
48
|
+
@wrappers ||= Hash.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.[](target)
|
52
|
+
wrappers[target]
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bruce-clingwrap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bruce Williams
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-05 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A simple library for wrapping Ruby methods using named or anonymous modules.
|
17
|
+
email: bruce@codefluency.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- clingwrap.gemspec
|
26
|
+
- lib/clingwrap.rb
|
27
|
+
- lib/clingwrap/basic.rb
|
28
|
+
- examples/simple.rb
|
29
|
+
has_rdoc: true
|
30
|
+
homepage: http://github.com/bruce/clingwrap
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: "0"
|
41
|
+
version:
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
requirements: []
|
49
|
+
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 1.2.0
|
52
|
+
signing_key:
|
53
|
+
specification_version: 2
|
54
|
+
summary: Simple method wrapping
|
55
|
+
test_files: []
|
56
|
+
|