require "roleplay/version" module Roleplay def included(base) base.send(:extend, ClassMethods) end def playing(name) modules = self.class.roles[name] value = self.dup modules.each do |m| value.extend m end value end alias :as_a :playing module ClassMethods attr_accessor :roles def plays_role(name, opts={}) @roles ||= {} roles[name] = [opts[:using]].flatten end def new_with_role(name) value = new value.singleton_class.send(:attr_accessor, :role) modules = roles[name] value.role = {name => modules} modules.each do |m| value.extend m end value end end end Object.send(:include, Roleplay)