lib/moosex.rb
# Module MooseX
# A postmodern object DSL for Ruby
#
# Author:: Tiago Peczenyj (mailto:tiago.peczenyj@gmail.com)
# Copyright:: Copyright (c) 2014 Tiago Peczenyj
# License:: MIT
require "moosex/version"
require "moosex/types"
require "moosex/exceptions"
require "moosex/meta"
require "moosex/core"
require "moosex/attribute"
require "moosex/traits"
require "weakref"
module MooseX
@@PLUGINS = []
@@ALIAS = nil
@@MOOSEX_WARNINGS = true
@@MOOSEX_FATAL = false
def self.warn(x, *c)
if @@MOOSEX_FATAL
raise FatalError, "[MooseX] exception: #{x}",*c
elsif @@MOOSEX_WARNINGS
Kernel.warn("[MooseX] warning: #{x}")
end
end
def self.init(args={})
if args.has_key? :warnings
@@MOOSEX_WARNINGS = !! args[:warnings]
end
if args.has_key? :fatal
@@MOOSEX_FATAL = !! args[:fatal]
end
if args.has_key?(:meta) && !! args[:meta]
@@ALIAS = (args[:meta].is_a?(TrueClass))? :meta : args[:meta]
end
if args.has_key?(:with_plugins)
@@PLUGINS = [ args[:with_plugins] ].flatten
end
self
end
def initialize(*args)
if self.respond_to? :BUILDARGS
args = self.BUILDARGS(*args)
else
args = args[0]
end
self.class.__moosex__meta.init(self, args || {})
self.BUILD() if self.respond_to? :BUILD
end
def MooseX.included(class_or_module)
class_or_module.extend(MooseX::Core)
unless class_or_module.respond_to? :__moosex__meta
meta = MooseX::Meta.new
@@PLUGINS.each do |plugin|
meta.add_plugin(plugin)
end
@@PLUGINS = []
class_or_module.define_singleton_method(:__moosex__meta) { meta }
if @@ALIAS
class_or_module.class_eval do
class_or_module.define_singleton_method(@@ALIAS) do
self.__moosex__meta
end
end
@@ALIAS = false
end
end
def class_or_module.init(*args)
__moosex__meta.init_roles(*args)
self
end
def class_or_module.inherited(subclass)
old_meta = subclass.__moosex__meta
meta = MooseX::Meta.new(old_meta)
subclass.define_singleton_method(:__moosex__meta) { meta }
end
def class_or_module.included(other_class_or_module)
MooseX.included(other_class_or_module)
other_class_or_module.__moosex__meta.load_from(self)
if other_class_or_module.is_a? Class
other_class_or_module.__moosex__meta.load_from_klass(self)
self.__moosex__meta.init_klass(other_class_or_module).each_pair do |method_name, proc|
other_class_or_module.class_eval do
define_method(method_name,&proc)
end
end
other_class_or_module.__moosex__meta.verify_requires_for(other_class_or_module)
end
end
end
end