class ActiveAdmin::AbstractViewFactory

def self.register(view_hash)

def self.register(view_hash)
  view_hash.each do |view_key, view_class|
    @@default_views[view_key] = view_class
  end
end

def [](key)

def [](key)
  get_view_for_key(key)
end

def []=(key, value)

def []=(key, value)
  set_view_for_key(key, value)
end

def default_for(key)

def default_for(key)
  @@default_views[key.to_sym]
end

def get_view_for_key(key)

def get_view_for_key(key)
  @views[key.to_sym] || @@default_views[key.to_sym]
end

def has_key?(key)

def has_key?(key)
  @views.has_key?(key.to_sym) || @@default_views.has_key?(key.to_sym)
end

def initialize

def initialize
  @views = {}
end

def key_from_method_name(method)

def key_from_method_name(method)
  method.to_s.gsub('=', '').to_sym
end

def method_missing(method, *args)

def method_missing(method, *args)
  key = key_from_method_name(method)
  if has_key?(key)
    if method.to_s.include?('=')
      self.class_eval <<-EOS
        def #{key}=(value)
          set_view_for_key(:#{key}, value)
        end
      EOS
    else
      self.class_eval <<-EOS
        def #{key}
          get_view_for_key(:#{key})
        end
      EOS
    end
    self.send(method, *args)
  else
    super
  end
end

def register(view_hash)


:another_view => OtherViewClass
factory.register :my_view => SomeClass,

You can setup many at the same time:

factory.register :my_view => SomeViewClass
factory = AbstractViewFactory.new

eg:

Register a new view key with the view factory
def register(view_hash)
  view_hash.each do |view_key, view_class|
    @views[view_key] = view_class
  end
end

def respond_to?(method)

Override respond to to include keys
def respond_to?(method)
  key = key_from_method_name(method)
  if has_key?(key)
    true
  else
    super
  end
end

def set_view_for_key(key, view)

def set_view_for_key(key, view)
  @views[key.to_sym] = view
end