Class: BitGirder::Core::BitGirderClassDefinition

Inherits:
Object
  • Object
show all
Extended by:
BitGirderMethods
Includes:
BitGirderMethods
Defined in:
lib/bitgirder/core.rb

Constant Summary collapse

REQUIRED_ATTRS =
[ :cls, :attrs, :attr_syms, :decl_order, :instance_mappers ]
@@class_defs =
{}
@@validation_listener =
nil

Constants included from BitGirderMethods

BitGirder::Core::BitGirderMethods::PARAM_TYPE_ARG, BitGirder::Core::BitGirderMethods::PARAM_TYPE_ENVVAR, BitGirder::Core::BitGirderMethods::PARAM_TYPE_KEY

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BitGirderMethods

argv_to_argh, check_fail_prefix, class_name_to_sym, compares_to, console, ext_to_class_name, ext_to_sym, has_env, has_key, has_keys, nonnegative, not_nil, positive, raisef, set_from_key, set_var, split_argv, sym_to_cli_switch, sym_to_ext_id, to_bool, unpack_argv_array, unpack_argv_hash, warn

Constructor Details

#initialize(opts) ⇒ BitGirderClassDefinition

Returns a new instance of BitGirderClassDefinition.



568
569
570
571
572
573
574
575
# File 'lib/bitgirder/core.rb', line 568

def initialize( opts )
    
    REQUIRED_ATTRS.each do |attr|

        val = BitGirderMethods.has_key( opts, attr )
        instance_variable_set( :"@#{attr}", val )
    end
end

Class Method Details

.code(*argv) ⇒ Object



797
798
799
# File 'lib/bitgirder/core.rb', line 797

def self.code( *argv )
    BitGirderLogger.code( *argv )
end

.default_instance_mappers_for(cls) ⇒ Object



758
759
760
761
762
763
764
765
766
767
768
769
770
771
# File 'lib/bitgirder/core.rb', line 758

def self.default_instance_mappers_for( cls )
    
    [
        InstanceMapper.new(
            :processor => lambda { |val| val.is_a?( cls ) && val } ),

        InstanceMapper.new(
            :processor => lambda { |val|
                # Use send in case cls made it private
                val.is_a?( Hash ) && cls.send( :new, val )
            }
        )
    ]
end

.for_class(cls) ⇒ Object



773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
# File 'lib/bitgirder/core.rb', line 773

def self.for_class( cls )

    unless res = @@class_defs[ cls ]
 
        attrs, decl_order =
            if cls == BitGirderClass || cls == BitGirderError
                [ {}, [] ]
            else 
                cd = self.for_class( cls.superclass )
                [ Hash.new.merge( cd.attrs ), Array.new( cd.decl_order ) ]
            end
 
        @@class_defs[ cls ] = res = new(
            :cls => cls,
            :attrs => attrs,
            :attr_syms => attrs.keys.map { |id| "@#{id}".to_sym },
            :decl_order => decl_order,
            :instance_mappers => self.default_instance_mappers_for( cls )
        )
    end
 
    res
end

.get_class_defsObject



736
737
738
# File 'lib/bitgirder/core.rb', line 736

def self.get_class_defs
    @@class_defs.dup
end

.get_validation_listenerObject



740
741
742
743
744
745
746
747
748
# File 'lib/bitgirder/core.rb', line 740

def self.get_validation_listener

    if res = @@validation_listener
        @@validation_listener = nil
        res
    else
        lambda { |attr, e| } # no-op is default
    end
end

.init_instance(inst, argv) ⇒ Object



801
802
803
# File 'lib/bitgirder/core.rb', line 801

def self.init_instance( inst, argv )
    self.for_class( inst.class ).init_instance( inst, argv )
end

.validation_listener=(l) ⇒ Object



750
751
752
753
754
755
756
# File 'lib/bitgirder/core.rb', line 750

def self.validation_listener=( l )
    
    BitGirderMethods.not_nil( l, :l )
    raise "A validation listener is already set" if @@validation_listener
   
    @@validation_listener = l
end

Instance Method Details

#add_attr(arg) ⇒ Object



592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
# File 'lib/bitgirder/core.rb', line 592

def add_attr( arg )

    attr = read_add_attr_arg( arg )
 
    if @attrs.key?( attr.identifier )
        msg = "Attribute #{attr.identifier.inspect} already defined"
        raise BitGirderAttribute::RedefinitionError, msg
    else
        ident = attr.identifier
        @attrs[ ident ] = attr
        @attr_syms << "@#{ident}".to_sym
        @decl_order << ident
        @cls.send( attr.mutable ? :attr_accessor : :attr_reader, ident )
    end
end

#hash_instance(inst) ⇒ Object



729
730
731
# File 'lib/bitgirder/core.rb', line 729

def hash_instance( inst )
    @decl_order.map { |id| @attrs[ id ].get_instance_value( inst ) }.hash
end

#init_instance(inst, argv) ⇒ Object



705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
# File 'lib/bitgirder/core.rb', line 705

def init_instance( inst, argv )

    argh =
        if argv.size == 0
            {}
        else
            if argv.size == 1 and ( arg = argv[ 0 ] ).is_a?( Hash )
                arg
            else
                argv_to_argh( argv, @decl_order )
            end
        end

    trace = caller
    listener = BitGirderClassDefinition.get_validation_listener

    @attrs.each_pair { |ident, attr| 
        set_attr_value( inst, argh, ident, attr, trace, listener ) 
    }

    impl_initialize( inst )
end