From: "Jean-François Trân" Date: 2007-11-24T04:59:52+09:00 Subject: Re: Developing Rails plugin: need some metaprog. help Hi Joshua, > I'm developing an authorization plugin that looks like the > following so far: > > module Incense > module Authorization > def self.included(base_class) > base_class.extend(ClassMethods) > end > > module ClassMethods > def performs_authorization(options = {}) > before_filter :prepare_user > > include(InstanceMethods) > end > end > end > > module InstanceMethods > private > def prepare_user > session[:user] ||= Member.find_by_id(2) # When there's no user_id > in the session, then use #2 for Guest > ... > end > > Because I extracted this functionality from an application, in > prepare_user() there's still a hardwired "Member" model used. > But in another application I need this to be a "User" model, so > I'd like to be able to specify the model to use in the options > hash of the performs_authorization() method. So how can I > achieve this? Do I have to use define_method() in the context of > performs_authorization? This would work, I guess, but I don't like > it very much... Isn't there another way? A simple way consists in storing the options hash as a class variable, you can then create instance and class method to get the class from the options hash : def performs_authorization(options = {}) before_filter :prepare_user cattr_accessor :options self.options = options include(InstanceMethods) end # give the name you want def user_model options[:user_model] end module InstanceMethods private def user_model self.class.user_model end def prepare_user session[:user] ||= user_model.find_by_id(2) ... end end HTH, -- Jean-François.