Sha256: 502fd4a3e299d61229a6c661059336016b26fdbf3154d02b125e53273b8fccbd

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

require "roleplay/version"

module Roleplay

  def included(base)
    base.send(:extend, ClassMethods)
  end

  def playing(name)
    modules = self.class.roles[name]
    raise "role #{name} does not define any modules" unless modules.present?
    value = self.dup
    value.singleton_class.send(:attr_accessor, :role)
    value.role = {name => modules}
    modules.each do |m|
      value.extend m
    end
    value
  end
  alias :as_a :playing

  def playing!(name)
    modules = self.class.roles[name]
    raise "role #{name} does not define any modules" unless modules.present?
    singleton_class.send(:attr_accessor, :role)
    self.role = {name => modules}
    modules.each do |m|
      extend m
    end
    self
  end
  alias :as_a! :playing!

  module ClassMethods

    attr_accessor :roles

    def plays_role(name, opts={})
      @roles ||= {}
      raise "no modules specified for role #{name}" unless opts[:using].present?
      roles[name] = [opts[:using]].flatten
    end

    def new_with_role(name)
      value = new
      modules = roles[name]
      raise "role #{name} does not define any modules" unless modules.present?
      value.singleton_class.send(:attr_accessor, :role)
      value.role = {name => modules}
      modules.each do |m|
        value.extend m
      end
      value
    end
  end
end

Object.send(:include, Roleplay)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
roleplay-0.0.3 lib/roleplay.rb