
require "ostruct"

module Scarlet
  class << self
    def init ssss , mod , h
      h.each do | m , *h |
        next unless ssss.methods.include? m
        a = ssss.method( m ).call *h
        mod.define_singleton_method "#{m}".to_sym  do | *h , &block | a.method( m ).call *h , &block  end
        mod.define_singleton_method "#{m.to_s.delete('!?')}_".to_sym do a end
      end
    end
  end
  module Default
    def self.extended mod
      Scarlet.init self , mod , [
        [ :uniq_sym  ] ,
      ]
    end
    def self.uniq_sym *h
      ru = Hash.new
      ru[:hs] = Hash.new
      a = OpenStruct.new ru
      a.define_singleton_method __method__ do | str = "misaka_" , n = rand(10000) |
        tmp = "#{str}_#{n}".to_sym
        if a.hs.keys.include? tmp
          return super_uniq_sym str , n + 1
        else
          a.hs.store( tmp , true )
          return tmp
        end
      end # singleton
      return a
    end # self
  end # Dfault
end

module A
  extend Scarlet::Default
end

p A.uniq_sym
