Skip to content

Commit

Permalink
Merge improvements to the AbstractClass mixin from elsewhere.
Browse files Browse the repository at this point in the history
  • Loading branch information
ged committed Jan 14, 2014
1 parent e4f4949 commit 16f9b44
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 41 deletions.
2 changes: 1 addition & 1 deletion lib/strelka/authprovider.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@
class Strelka::AuthProvider
extend Loggability,
Pluggability,
Strelka::AbstractClass,
Strelka::Delegation
include Strelka::Constants,
Strelka::AbstractClass,
Strelka::ResponseHelpers

# Loggability API -- set up logging under the 'strelka' log host
Expand Down
6 changes: 3 additions & 3 deletions lib/strelka/httprequest/acceptparams.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ class Strelka::HTTPRequest
# * Mahlon E. Smith <mahlon@martini.nu>
#
class AcceptParam
extend Loggability
include Comparable,
Strelka::AbstractClass
extend Loggability,
Strelka::AbstractClass
include Comparable


# Loggability API -- set up logging under the 'strelka' log host
Expand Down
55 changes: 27 additions & 28 deletions lib/strelka/mixins.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# vim: set nosta noet ts=4 sw=4:
# encoding: utf-8


require 'tempfile'

require 'strelka' unless defined?( Strelka )
Expand All @@ -16,49 +17,47 @@ module Strelka
#
# # AbstractClass
# class MyBaseClass
# include Strelka::AbstractClass
# extend Strelka::AbstractClass
#
# # Define a method that will raise a NotImplementedError if called
# pure_virtual :api_method
# end
#
module AbstractClass

### Methods to be added to including classes
module ClassMethods

### Define one or more "virtual" methods which will raise
### NotImplementedErrors when called via a concrete subclass.
def pure_virtual( *syms )
syms.each do |sym|
define_method( sym ) do |*args|
raise ::NotImplementedError,
"%p does not provide an implementation of #%s" % [ self.class, sym ],
caller(1)
end
end
end


### Turn subclasses' new methods back to public.
def inherited( subclass )
subclass.module_eval { public_class_method :new }
super
end

end # module ClassMethods
### Extension callback -- mark the extended object's .new as private
def self::extended( mod )
super
mod.class_eval { private_class_method :new }
end


### Inclusion callback
### Inclusion callback -- support backward-compatible inclusion.
def self::included( mod )
mod.extend( self )
super
if mod.respond_to?( :new )
mod.extend( ClassMethods )
mod.module_eval { private_class_method :new }
end


### Define one or more "virtual" methods which will raise
### NotImplementedErrors when called via a concrete subclass.
def pure_virtual( *syms )
syms.each do |sym|
define_method( sym ) do |*args|
raise ::NotImplementedError,
"%p does not provide an implementation of #%s" % [ self.class, sym ],
caller(1)
end
end
end


### Inheritance callback -- Turn subclasses' .new methods back to public.
def inherited( subclass )
subclass.module_eval { public_class_method :new }
super
end

end # module AbstractClass


Expand Down
3 changes: 1 addition & 2 deletions lib/strelka/plugins.rb
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,6 @@ def register_plugin( mod )

self.log.debug " copying class instance variable %s (%p)" % [ ivar, copy ]

# Don't duplicate modules/classes or immediates
instance_variable_set( ivar, copy )
self.log.debug " instance variable %p set to %p in %p" %
[ ivar, self.instance_variable_get(ivar), self ]
Expand Down Expand Up @@ -268,7 +267,7 @@ def install_plugins
next
end

self.log.info " including %p." % [ mod ]
self.log.info " including %p in %p." % [ mod, self ]
include( mod )
end

Expand Down
4 changes: 2 additions & 2 deletions lib/strelka/router.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
# #add_route and #route_request methods.
class Strelka::Router
extend Loggability,
Pluggability
include Strelka::AbstractClass
Pluggability,
Strelka::AbstractClass

# Loggability API -- set up logging under the 'strelka' log host
log_to :strelka
Expand Down
4 changes: 2 additions & 2 deletions lib/strelka/session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@
#
class Strelka::Session
extend Loggability,
Pluggability
include Strelka::AbstractClass
Pluggability,
Strelka::AbstractClass


# Loggability API -- set up logging under the 'strelka' log host
Expand Down
6 changes: 3 additions & 3 deletions spec/strelka/mixins_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
describe Strelka::AbstractClass do

context "mixed into a class" do
it "will cause the including class to hide its ::new method" do
testclass = Class.new { include Strelka::AbstractClass }
it "will cause the extended class to hide its ::new method" do
testclass = Class.new { extend Strelka::AbstractClass }

expect {
testclass.new
Expand All @@ -34,7 +34,7 @@

before(:each) do
testclass = Class.new {
include Strelka::AbstractClass
extend Strelka::AbstractClass
pure_virtual :test_method
}
subclass = Class.new( testclass )
Expand Down

0 comments on commit 16f9b44

Please sign in to comment.