Skip to content

Instantly share code, notes, and snippets.

@wycats
Created June 11, 2010 18:16
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save wycats/434844 to your computer and use it in GitHub Desktop.
Save wycats/434844 to your computer and use it in GitHub Desktop.

If one was inclined to use the acts_as_yaffle pattern, they would probably use the second one, rather than the heavily cargo-culted first one.

module Yaffle
def self.included(base)
base.send :extend, ClassMethods
end
module ClassMethods
def acts_as_yaffle(options = {})
cattr_accessor :yaffle_text_field
self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
send :include, InstanceMethods
end
end
module InstanceMethods
def squawk(string)
write_attribute(self.class.yaffle_text_field, string.to_squawk)
end
end
end
ActiveRecord::Base.send :include, Yaffle
module Yaffle
def acts_as_yaffle(options = {})
cattr_accessor :yaffle_text_field
self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
include InstanceMethods
end
module InstanceMethods
def squawk(string)
write_attribute(self.class.yaffle_text_field, string.to_squawk)
end
end
end
ActiveRecord::Base.extend(Yaffle)
module Yaffle
# since this is for internal consumption only, just extend directly;
# don't rewrite the include method to mean extend
def self.included(base)
# extend is a public method
base.send :extend, ClassMethods
end
# if we extended directly, we could get rid of the ClassMethods
# module and move the methods into the Yaffle module. You onluy
# ever need one of ClassMethods or InstanceMethods
module ClassMethods
def acts_as_yaffle(options = {})
cattr_accessor :yaffle_text_field
self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
# we're inside the class, so we don't need to use send to
# use a private method
send :include, InstanceMethods
end
end
module InstanceMethods
def squawk(string)
write_attribute(self.class.yaffle_text_field, string.to_squawk)
end
end
end
# If we'd used extend, we wouldn't need a send
ActiveRecord::Base.send :include, Yaffle
@raggi
Copy link

raggi commented Jun 15, 2010

i was only asking because i'm done with this.

oh, i see, you were trying to be "artistic"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment