can_has_meta 0.1.0

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/HISTORY ADDED
@@ -0,0 +1,4 @@
1
+ can_has_bots Release History
2
+
3
+ Version 0.1.0 (22 March 2008)
4
+ * Initial release.
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2008 Ben Burkert <ben@benburkert.com>
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name of this project nor the names of its contributors may be
13
+ used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README ADDED
@@ -0,0 +1,73 @@
1
+ = can_has_meta
2
+
3
+ this gem is meta
4
+
5
+ Author:: Ben Burkert (mailto:ben@benburkert.com)
6
+ Version:: 0.1.0
7
+ Copyright:: Copyright (c) 2008 Ben Burkert. All rights reserved.
8
+ License:: New BSD License (http://opensource.org/licenses/bsd-license.php)
9
+ Website:: http://canhasgems.rubyforge.org/can_has_meta
10
+ Repository:: git://github.com/benburkert/can_has_meta.git
11
+
12
+ == Dependencies
13
+
14
+ == Basic Usage
15
+
16
+ can_has_meta adds three new items to your meta programming toolshed.
17
+
18
+ = Object#instance_eval(*args, &block)
19
+
20
+ instance_eval has been modified to allow parameters to the block:
21
+
22
+ "abc".instance_eval("def") do |s|
23
+ p self << s # => "abcdef"
24
+ end
25
+
26
+ = Module#macros(&block)
27
+
28
+ macros evaluates the block in the including class's class, got it? Basically, it makes it super
29
+ easy to add "acts_as_*" style methods:
30
+
31
+ module Foo
32
+ macros do
33
+ def acts_as_foo
34
+ def baz
35
+ "FOO-BAR-BAZ!"
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ class Bar
42
+ include Foo
43
+
44
+ acts_as_foo
45
+ end
46
+
47
+ p Bar.new.baz # => "FOO-BAR-BAZ"
48
+
49
+ = Module#mixins(&block)
50
+
51
+ mixins evaluates the block in the including class' instance. This allows you to manipulate the type
52
+ including the module directly.
53
+
54
+ module Foo
55
+ p self
56
+
57
+ mixins do
58
+ p self
59
+
60
+ def foo_bar_baz; end
61
+ end
62
+ end
63
+ # => Foo
64
+
65
+ module Bar
66
+ include Foo
67
+ end
68
+ # => Bar
69
+
70
+ class Baz
71
+ include Bar
72
+ end
73
+ # => Baz
@@ -0,0 +1,75 @@
1
+ # -*- ruby -*-
2
+
3
+ require "rake"
4
+ require "rake/clean"
5
+ require "rake/gempackagetask"
6
+ require 'rake/rdoctask'
7
+ require "spec"
8
+ require "spec/rake/spectask"
9
+
10
+ DIR = File.dirname(__FILE__)
11
+ NAME = 'can_has_meta'
12
+ SUMMARY =<<-EOS
13
+ this gem is meta
14
+ EOS
15
+
16
+ require "lib/#{NAME}/version"
17
+
18
+ spec = Gem::Specification.new do |s|
19
+ s.name = NAME
20
+ s.summary = SUMMARY
21
+
22
+ s.version = CanHasMeta::VERSION
23
+ s.platform = Gem::Platform::RUBY
24
+
25
+ s.require_path = "lib"
26
+ s.files = %w(Rakefile LICENSE HISTORY README TODO) + Dir["{lib,adapters,examples}/**/*"]
27
+ end
28
+
29
+ Rake::GemPackageTask.new(spec) do |package|
30
+ package.gem_spec = spec
31
+ package.need_zip = true
32
+ package.need_tar = true
33
+ end
34
+
35
+ ##############################################################################
36
+ # Documentation
37
+ ##############################################################################
38
+ task :doc => "doc:rerdoc"
39
+ namespace :doc do
40
+
41
+ Rake::RDocTask.new do |rdoc|
42
+ files = %w(Rakefile README) + Dir["{lib,adapters,examples}/**/*"]
43
+ rdoc.rdoc_files.add(files)
44
+ rdoc.main = 'README'
45
+ rdoc.title = 'I CAN HAS META? OH SNAPZ!'
46
+ rdoc.template = 'tools/allison-2.0.3/lib/allison'
47
+ rdoc.rdoc_dir = "doc/#{NAME}/rdoc"
48
+ rdoc.options << '--line-numbers' << '--inline-source'
49
+ end
50
+
51
+ desc "rdoc to rubyforge"
52
+ task :rubyforge => :doc do
53
+ sh %{chmod -R 755 doc}
54
+ sh %{/usr/bin/scp -r -p doc/#{NAME}/rdoc/* benburkert@rubyforge.org:/var/www/gforge-projects/canhasgems/#{NAME}}
55
+ end
56
+ end
57
+
58
+ ##############################################################################
59
+ # rSpec & rcov
60
+ ##############################################################################
61
+ desc "Run all specs"
62
+ Spec::Rake::SpecTask.new("specs") do |t|
63
+ t.spec_opts = ["--format", "specdoc", "--colour"]
64
+ t.spec_files = Dir["spec/**/*_spec.rb"].sort
65
+ end
66
+
67
+ ##############################################################################
68
+ # release
69
+ ##############################################################################
70
+ task :release => [:specs, :package] do
71
+ sh %{rubyforge add_release canhasgems #{NAME} "#{CanHasMeta::VERSION}" pkg/#{NAME}-#{CanHasMeta::VERSION}.gem}
72
+ %w[zip tgz].each do |ext|
73
+ sh %{rubyforge add_file canhasgems #{NAME} #{CanHasMeta::VERSION} pkg/#{NAME}-#{CanHasMeta::VERSION}.#{ext}}
74
+ end
75
+ end
data/TODO ADDED
File without changes
@@ -0,0 +1,6 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+
3
+ module CanHasMeta; end
4
+
5
+ require "can_has_meta/core_ext/object"
6
+ require "can_has_meta/core_ext/module"
@@ -0,0 +1,32 @@
1
+ class Module
2
+ attr_accessor :macro_blocks, :mixin_blocks, :included_callbacks
3
+
4
+ def macros(&block)
5
+ @macro_blocks ||= [] << block
6
+ end
7
+
8
+ def mixins(&block)
9
+ @mixin_blocks ||= [] << block
10
+ end
11
+
12
+ def included_with_meta(base, &block)
13
+ if base.class == Module
14
+ (@macro_blocks ||= []).each {|mb| (base.macro_blocks ||= []) << mb}
15
+ (@mixin_blocks ||= []).each {|mb| (base.mixin_blocks ||= []) << mb}
16
+ (@included_callbacks ||= []).each {|ic| base.included_callbacks << ic}
17
+ elsif base.class == Class
18
+ (@macro_blocks ||= []).each {|mb| base.class.class_eval(&mb)}
19
+ (@mixin_blocks ||= []).each {|mb| base.class_eval(&mb)}
20
+ (@included_callbacks ||= []).each {|ic| base.instance_eval(&ic)}
21
+ end
22
+
23
+ included_without_meta(base, &block)
24
+ end
25
+
26
+ alias_method :included_without_meta, :included
27
+ alias_method :included, :included_with_meta
28
+
29
+ def included_callback(&block)
30
+ @included_callbacks ||= [] << block
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ class Object
2
+ def klass
3
+ self.class
4
+ end
5
+
6
+ def instance_eval_with_args_check(*args, &block)
7
+ unless args.empty? || block.nil?
8
+ instance_eval_with_args(*args, &block)
9
+ else
10
+ instance_eval_without_args_check(*args, &block)
11
+ end
12
+ end
13
+
14
+ alias_method :instance_eval_without_args_check, :instance_eval
15
+ alias_method :instance_eval, :instance_eval_with_args_check
16
+
17
+ def instance_eval_with_args(*args, &block)
18
+ while respond_to?(random_name = "temp_method#{rand(1000)}"); end
19
+
20
+ klass.class_eval do
21
+ define_method(random_name, &block)
22
+ end
23
+
24
+ self.send(random_name, *args)
25
+
26
+ klass.class_eval("undef #{random_name}")
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module CanHasMeta
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: can_has_meta
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors: []
7
+
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-03-22 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email:
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - LICENSE
27
+ - HISTORY
28
+ - README
29
+ - TODO
30
+ - lib/can_has_meta
31
+ - lib/can_has_meta/core_ext
32
+ - lib/can_has_meta/core_ext/module.rb
33
+ - lib/can_has_meta/core_ext/object.rb
34
+ - lib/can_has_meta/version.rb
35
+ - lib/can_has_meta.rb
36
+ has_rdoc: false
37
+ homepage:
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ requirements: []
56
+
57
+ rubyforge_project:
58
+ rubygems_version: 1.0.1
59
+ signing_key:
60
+ specification_version: 2
61
+ summary: this gem is meta
62
+ test_files: []
63
+